2015-12-16 11 views
10

Desidero aggiungere le lettere di una stringa a un elenco, ma desidero solo aggiungere ciascuna lettera una volta. Ad esempio, se la stringa è "HELLO AM CHRISTOS WHITE", alcune lettere appaiono più di una volta, quindi voglio che vengano aggiunte una sola volta.Aggiungere lettere univoche di una determinata stringa a un elenco

Sto pensando a due cicli for:

for (int i=0; i< str.length(); i++){ 
    for(int j=0; j< str.length(); j++){ 
     if (str.charAt(i) != str.charAt(j)) { 
      myList.add(charAt(i)); 
     } 
    } 
} 

Ma questo codice non evita i duplicati.

+0

Perché due anelli? scorrere su un singolo originalLine.toCharArray(); if (! listContains (Char.valueOf (char [i])) addChar(); – Stultuske

+3

In alternativa, è possibile utilizzare un 'Set' per ottenere univocità del suo contenuto. –

risposta

14

Sarebbe più efficiente utilizzare un LinkedHashSet per determinare i caratteri unici. Se si utilizza un LinkedHashSet, l'ordine dei caratteri univoci della stringa di input verrà mantenuto.

Dopo un singolo ciclo, che richiederebbe un tempo lineare, è possibile aggiungere tutti i caratteri univoci all'output List.

Set<Character> unique = new LinkedHashSet<>(); 
for (int i = 0; i < str.length(); i++){ 
    unique.add(str.charAt(i)); 
} 
myList.addAll(unique); 
12

Per evitare duplicati in una raccolta, non è necessario List, è necessario un Set (ad esempio HashSet).

Se si desidera conservare l'ordine in cui si aggiunge il numero String, utilizzare LinkedHashSet.

Infine, se si desidera che il Set per ordinare i tuoi naturalmente String s (o per essere in grado di ordinarli con un Comparator), utilizzare un TreeSet.

Esempio

String foo = "ghghababcdef"; 
Set<String> hash = new HashSet<>(); 
Set<String> linked = new LinkedHashSet<>(); 
Set<String> tree = new TreeSet<>(); 
// iterating characters 
for (char c: foo.toCharArray()) { 
    // adding String representation of character to each set 
    hash.add(Character.toString(c)); 
    linked.add(Character.toString(c)); 
    tree.add(Character.toString(c)); 
} 
// printing... 
System.out.println(hash); 
System.out.println(linked); 
System.out.println(tree); 

uscita

[a, b, c, d, e, f, g, h] // this may vary 
[g, h, a, b, c, d, e, f] // keeps insertion order 
[a, b, c, d, e, f, g, h] // sorted lexicographically by default 
4

come alternativa alla Set risposta se si vuole attaccare alla soluzione List. È necessario eseguire un ciclo solo una volta e utilizzare il metodo List.contains(Object) e verificare se l'attuale char è già presente nello List.

String str = "HELLO AM CHRISTOS WHITE"; 
List<Character> myList = new ArrayList<>(); 
for(int i=0; i< str.length(); i++){ 
    if (!myList.contains(str.charAt(i))) { 
     myList.add(str.charAt(i)); 
    } 
} 
for(char c : myList) { 
    System.out.println(c); 
} 

uscita

HELO AMCRISTW

0

j non viene configurato. Immagino che sia inizializzato a 0 quindi non ci sono eccezioni

Se si modifica il secondo ciclo su for(int j=0; j< str.length(); j++), non funzionerà ancora, non stamperà alcuna lettera duplicata nella stringa.

Quindi pensa a quale intervallo j deve essere ripetuto. Si desidera stampare qualsiasi lettera che non si è già verificata nella stringa, se si ottiene il mio jist.

+0

È stato solo un esempio nel mio programma è corretto. –

+0

@ChristosMichael: In tal caso sarebbe una buona idea accettare la risposta che meglio risponde alla tua domanda e aiutare i futuri visitatori a identificare rapidamente una soluzione funzionante al loro problema. Vedi [Cosa devo fare quando qualcuno risponde la mia domanda?] (http://stackoverflow.com/help/someone-answers) – IInspectable

+0

La mia risposta stava rispondendo all'errore nel codice che hai fornito, come posso sapere cosa hai nel tuo programma. volevo affrontare il problema nella logica implementata, non rendersi conto di avere altre opzioni per utilizzare strutture dati ben note. –

0

purtroppo non c'è flusso di caratteri in Java 8, ma qui è un modo Java 8:

str.chars().distinct().mapToObj(c -> (char) c).collect(Collectors.toList()); 

potrebbe essere meno efficiente, ma si tratta di un leggibile uno di linea e lo dimostra il potere dei flussi.

Problemi correlati