PDA

View Full Version : [java] confronto tra array di stringhe


antoniod82
10-09-2007, 08:29
Ho 2 vettori di stringhe di cui uno è un sottinsieme dell'altro.
Esiste un metodo che mi ritorni un terzo array contenente le stringhe che sono in quello con + più stringhe ma nn nell'altro??

grazie.

andbin
10-09-2007, 08:47
Ho 2 vettori di stringhe di cui uno è un sottinsieme dell'altro.
Esiste un metodo che mi ritorni un terzo array contenente le stringhe che sono in quello con + più stringhe ma nn nell'altro??Se intendi un qualche metodo nel framework standard di Java, no non mi risulta che ci sia.

Ma puoi certamente fartelo tu, non è affatto difficile.

EDIT: ti dò anche un aiuto, se questa elaborazione la fai passando attraverso una collection (es. LinkedList) fai tutto in 6 righe di codice pulite pulite senza fare neanche 1 loop.

antoniod82
10-09-2007, 19:57
me ne sono uscito in 5 righe ma con 2 loop:

1. nel primo sostituisco nell'array + grande un carattere "x" al posto degli elementi in comune;

2. nel secondo mi costruisco un array scartando dall'ultimo gli elementi uguali a "x".

ieri ho messo un altro thread, nn so se l'hai letto, mica sai se si può creare il diagramma UML di un progetto direttamente in JBuilder??

grazie e alla prossima,
Antonio

andbin
11-09-2007, 08:57
me ne sono uscito in 5 righe ma con 2 loop:

1. nel primo sostituisco nell'array + grande un carattere "x" al posto degli elementi in comune;

2. nel secondo mi costruisco un array scartando dall'ultimo gli elementi uguali a "x".Beh, scusa se lo dico ma questa è una gran boiata. Ma se ti piace così .....

Si potrebbe fare (come avevo detto prima) usando solamente le collezioni:
public static String[] arrayAMinusB (String[] a, String[] b)
{
LinkedList<String> list1 = new LinkedList<String> ();
LinkedList<String> list2 = new LinkedList<String> ();
Collections.addAll (list1, a);
Collections.addAll (list2, b);
list1.removeAll (list2);
return list1.toArray (new String[list1.size()]);
}Così è estremamente pulito ed elegante.

Se si volesse farlo senza usare in alcun modo le collezioni, si potrebbe fare così:
public static String[] arrayAMinusB (String[] a, String[] b)
{
String[] v = a.clone ();
int n = 0;

main:
for (int i = 0; i < v.length; i++)
{
for (int j = 0; j < b.length; j++)
if (v[i] == b[j])
continue main;

v[n++] = v[i];
}

String[] r = new String[n];
System.arraycopy (v, 0, r, 0, n);
return r;
}

Se poi si volesse realizzare una soluzione intermedia che utilizza una collezione, si potrebbe fare così:
public static String[] arrayAMinusB (String[] a, String[] b)
{
LinkedList<String> list = new LinkedList<String> ();

main:
for (int i = 0; i < a.length; i++)
{
for (int j = 0; j < b.length; j++)
if (a[i] == b[j])
continue main;

list.add (a[i]);
}

return list.toArray (new String[list.size()]);
}

E nota che nessuna delle tre soluzioni va ad alterare in alcun modo gli array originali. Insomma .... di soluzioni migliori della tua ce ne sono.

rayman2
11-09-2007, 10:38
anche perchè se poi nell'array c'è già una stringa contenente solo "x" non funziona più niente!

antoniod82
17-09-2007, 03:12
caro andbin,

ti confermi maestro.

grazie

antoniod82
17-09-2007, 03:13
(da cancellare)