metodo Le raccolte Java convertono una stringa in un elenco di caratteri



metodo charat java (7)

Vorrei convertire la stringa contenente abc in una lista di caratteri e un hashset di caratteri. Come posso farlo in Java?

List<Character> charList = new ArrayList<Character>("abc".toCharArray());

Answer #1

IntStream può essere usato per accedere a ciascun personaggio e aggiungerli alla lista.

String str = "abc";
List<Character> charList = new ArrayList<>();
IntStream.range(0,str.length()).forEach(i -> charList.add(str.charAt(i)));

Answer #2

Dovrai utilizzare un loop o creare un wrapper di raccolta come Arrays.asList che funziona su array di caratteri primitivi (o direttamente su stringhe).

List<Character> list = new ArrayList<Character>();
Set<Character> unique = new HashSet<Character>();
for(char c : "abc".toCharArray()) {
    list.add(c);
    unique.add(c);
}

Ecco un wrapper Arrays.asList come per le stringhe:

public List<Character> asList(final String string) {
    return new AbstractList<Character>() {
       public int size() { return string.length(); }
       public Character get(int index) { return string.charAt(index); }
    };
}

Questo è un elenco immutabile, però. Se vuoi un elenco mutabile, usalo con un char[] :

public List<Character> asList(final char[] string) {
    return new AbstractList<Character>() {
       public int size() { return string.length; }
       public Character get(int index) { return string[index]; }
       public Character set(int index, Character newVal) {
          char old = string[index];
          string[index] = newVal;
          return old;
       }
    };
}

Analogamente a ciò è possibile implementarlo per gli altri tipi primitivi. Si noti che l'utilizzo di questo metodo normalmente non è consigliato, poiché per ogni accesso si eseguirà un'operazione di boxing e unboxing.

La libreria Guava contiene metodi di wrapper Elenco simili per diverse classi di array primitive , come Chars.asList e un wrapper per String in Lists.charactersOf(String) .


Answer #3

In Java8 puoi usare gli stream, suppongo. Elenco di oggetti personaggio:

List<Character> chars = str.chars().mapToObj(e->(char)e).collect(Collectors.toList());

E il set potrebbe essere ottenuto in modo simile:

Set<Character> charsSet = str.chars().mapToObj(e->(char)e).collect(Collectors.toSet());

Answer #4

La mancanza di un buon modo per convertire tra una matrice primitiva e una collezione del corrispondente tipo di wrapper è risolta da alcune librerie di terze parti. Guava, molto comune, ha un metodo comodo per fare la conversione :

List<Character> characterList = Chars.asList("abc".toCharArray());
Set<Character> characterSet = new HashSet<Character>(characterList);

Answer #5

Puoi farlo senza boxe se usi le raccolte di Eclipse :

CharAdapter abc = CharAdapter.adapt("abc");
CharList list = abc.toList();
CharSet set = abc.toSet();
CharBag bag = abc.toBag();

Poiché CharAdapter è una CharAdapter , chiamare collect su di esso restituirà una ImmutableList .

ImmutableList<Character> immutableList = abc.collect(Character::valueOf);

Se si desidera restituire una List , un Set o una Bag di Character , funzionerà quanto segue:

LazyIterable<Character> lazyIterable = abc.asLazy().collect(Character::valueOf);
List<Character> list = lazyIterable.toList();
Set<Character> set = lazyIterable.toSet();
Bag<Character> set = lazyIterable.toBag();

Nota: sono un committer per le raccolte di Eclipse.


Answer #6

Usa un Stream Java 8.

myString.chars().mapToObj(i -> (char) i).collect(Collectors.toList());

Abbattersi:

myString
    .chars() // Convert to an IntStream
    .mapToObj(i -> (char) i) // Convert int to char, which gets boxed to Character
    .collect(Collectors.toList()); // Collect in a List<Character>

(Non ho assolutamente idea del perché String#chars() restituisca un IntStream .)


Answer #7

Il modo più semplice è utilizzare un ciclo for per aggiungere elementi a una nuova List :

String abc = "abc";
List<Character> charList = new ArrayList<Character>();

for (char c : abc.toCharArray()) {
  charList.add(c);
}

Allo stesso modo, per un Set :

String abc = "abc";
Set<Character> charSet = new HashSet<Character>();

for (char c : abc.toCharArray()) {
  charSet.add(c);
}




collections