Java-Sammlungen konvertieren eine Zeichenfolge in eine Liste von Zeichen

Lesezeit: 3 Minuten

Benutzer-Avatar
Phönix

Ich möchte die Zeichenfolge mit konvertieren abc zu einer Liste von Zeichen und einem Hashset von Zeichen. Wie kann ich das in Java machen?

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

Benutzer-Avatar
waggledans

In Java8 können Sie Streams verwenden, nehme ich an. Liste der Charakterobjekte:

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

Und set könnte auf ähnliche Weise erhalten werden:

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

  • Importieren java.util.stream.Collectors ist erforderlich, damit dieses Snippet funktioniert.

    – Andrea Gottardo

    5. August 2019 um 22:12 Uhr


  • Das chars -Methode wurde in Java 9 eingeführt – sie existiert nicht in Java 8.

    – Steve Kammern

    15. Oktober 2021 um 8:22 Uhr

  • @SteveChambers Es existiert auf CharSequence unter Java8: docs.oracle.com/javase/8/docs/api/java/lang/…

    – Uneingeschränkt

    9. November 2021 um 6:04 Uhr

  • @Unmitigated Ah, guter Punkt.

    – Steve Kammern

    9. November 2021 um 8:55 Uhr

Benutzer-Avatar
Paulo Ebermann

Sie müssen entweder eine Schleife verwenden oder einen Sammlungs-Wrapper wie erstellen Arrays.asList was auf primitiven Char-Arrays (oder direkt auf Strings) funktioniert.

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

Hier ist ein Arrays.asList wie Wrapper für Strings:

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); }
    };
}

Dies ist jedoch eine unveränderliche Liste. Wenn Sie eine veränderliche Liste wünschen, verwenden Sie diese mit a 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;
       }
    };
}

Analog dazu können Sie dies auch für die anderen primitiven Typen implementieren.
Beachten Sie, dass die Verwendung normalerweise nicht empfohlen wird, da Sie für jeden Zugriff einen Boxing- und Unboxing-Vorgang durchführen würden.

Das Guave-Bibliothek enthält ähnliche List-Wrapper-Methoden für mehrere primitive Array-Klassenwie Chars.asListund einen Wrapper für String in Lists.charactersOf (String).

Das Fehlen einer guten Möglichkeit, zwischen einem primitiven Array und einer Sammlung des entsprechenden Wrapper-Typs zu konvertieren, wird durch einige Bibliotheken von Drittanbietern gelöst. Guave, eine sehr häufige, hat eine bequeme Methode, um die Konvertierung durchzuführen:

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

  • Sieht aus, als hätte ich hier das Rad neu erfunden … nehme ich an Chars.asList macht über das, was die asList Methode in meiner Antwort tut.

    – Paulo Ebermann

    12. Juni 2011 um 4:07 Uhr

  • Auch in Guave ist Lists.charactersOf("abc") Das ist etwas kürzer und lässt uns nicht anrufen toCharArray()

    – Brad Cupit

    6. Januar 2014 um 18:45 Uhr


Benutzer-Avatar
Verkauf

Verwenden Sie ein Java 8 Stream.

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

Abbauen:

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>

(Ich habe absolut keine Ahnung warum String#chars() gibt ein zurück IntStream.)

Der einfachste Weg ist die Verwendung von a for Schleife, um Elemente zu einer neuen hinzuzufügen List:

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

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

Ebenso für a Set:

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

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

Benutzer-Avatar
Matthias Allain

List<String> result = Arrays.asList("abc".split(""));

Benutzer-Avatar
Richard A.

Erstellen Sie eine leere Liste von Zeichen und machen Sie dann eine Schleife, um jedes Zeichen aus dem Array zu holen und sie einzeln in die Liste einzufügen.

List<Character> characterList = new ArrayList<Character>();
char arrayChar[] = abc.toCharArray();
for (char aChar : arrayChar) 
{
    characterList.add(aChar); //  autoboxing 
}

1175320cookie-checkJava-Sammlungen konvertieren eine Zeichenfolge in eine Liste von Zeichen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy