2017-04-04 6 views
2

Gibt es einen einfachen Weg in Java, um durch Leerzeichen getrennte Werte in char-Array zu konvertieren.Lesen eines Arrays von Zeichen aus durch Leerzeichen getrennten Werten

Beispiel: "a b c" muss ['a', 'b', 'c'] werden;

Ich versuchte

Scanner scanner = new Scanner(System.in); 
char[] letters = Arrays.stream(scanner.nextLine().split(" ")) 
         .map(a->a.charAt(0)).toArray();     

, aber das gibt einen Object [] anstelle von char [], so dass es nicht funktioniert.

Ich weiß, ich kann es auf diese Weise tun:

Scanner scanner = new Scanner(System.in); 
    ArrayList<Character> letters = new ArrayList<>(); 
    char[] line = scanner.nextLine().toCharArray(); 
    for (int i = 0; i < line.length; i++) { 
      if(line[i]!=' '){ 
       letters.add(line[i]); 
      } 
    } 

Aber ich frage mich, ist es ein direkterer Ansatz?

Antwort

1

Das Hauptproblem besteht darin, dass Streams nicht mit Primitiven wie char oder byte umgehen sollen. Der einzige primitive Typ, den Sie standardmäßig behandeln können, ist int, long und double. Also, wenn Sie Streams und Lambdas verwenden möchten, müssen Sie für jeden Typ, der in Ihrem Fall das Objekt Character ist, zur Objektversion wechseln.

toArray() Methode gibt ein Array von Objekt zurück, Sie müssen .collect(Collectors.toList()) verwenden, die eine ArrayList zurückgibt. mit einem Strom

List<Character> collect = Arrays.stream(scanner.nextLine().split(" ")) 
         .map(a -> new a.charAt(0)).collect(Collectors.toList()); 
+0

Vielen Dank für die Erklärung, es ist sehr hilfreich :) – Yangra

+0

:) Danke. Der Umgang mit primitiven Typen mit Strömen schafft einigen feinen Unterschied mit der klassischen Strömung verglichen, dass manchmal das Leben schwer machen – freedev

0

aus dem Code Ausarbeiten, könnten Sie ein Collector verwenden, um ein List zu bauen:

ArrayList<Character> letters = Arrays.stream(scanner.nextLine().split(" ")) 
        .map(a->a.charAt(0)).collect(Collectors.toList()); 

auch, falls Sie verwenden oder bereit, die Guava Utility-Bibliothek zu verwenden, könnten Sie Finden Sie Splitter nützlich anstelle der split Methode (obwohl es Ihr spezifisches Problem nicht direkt löst).

+0

Sie wollen ein Array keine Liste (obwohl ich weiß nicht, warum) – slim

1

Warum einfach Ihre Lösung mit einer einfachen Erweiterung mit den Leerzeichen entfernen ?:

char[] letters = scanner.nextLine().replaceAll("\s","").toCharArray(); 
0

Wenn Sie mit einem Array von Character[] Art leben können, können Sie diese Methode verwenden können:

Character[] letters = Arrays.stream(scanner.nextLine().split(" ")).map(a -> a.charAt(0)).toArray(Character[]::new); 

Leider funktioniert dies nicht mit char[]::new, wenn Sie also den primitiven Typ char[] haben müssen, müssen Sie das Array danach zu char[] konvertieren.Sie können entweder Apache Commons Lang Methode

ArrayUtils.toPrimitive(letters); 

verwenden oder tun dies selbst

char[] a = new char[letters.length]; 
for (int i = 0; i < letters.length; i++) { 
    a[i] = letters[i]; 
} 
0

Diese Arbeit sollte:

char[] letters = Arrays.stream(scanner.nextLine().split("\\s+")) 
         .collect(Collectors.joining("")) 
         .toCharArray(); 

Aber ich würde wahrscheinlich ein Guava CharMatcher verwenden:

char[] letters = CharMatcher.WHITESPACE.removeFrom(scanner.nextLine()) 
             .toCharArray(); 
0

Ihr Hauptproblem dabei ist, dass Stream ist von Natur aus einem Strom von Objekten, nicht Primitiven.

Es gibt parallele Typen IntStream, LongStream, DoubleStream aber es gibt keine CharStream.

Sie könnten entscheiden, dass die Verwendung von int statt char genug für Sie ist, und Sie tun können, dass mit:

int[] letters = Arrays.stream(scanner.nextLine().split(" ")) 
        .mapToInt(a-> (int) a.charAt(0)) 
        .toArray(); 

Beachten Sie, dass dies für die Designer der Java-Bibliothek gut genug ist: String.chars() eine IntStream zurück .

Alternativ könnten Sie:

  • schreiben Sie Ihre eigene Collector
  • oder wandeln die int[] zu char[] als separater Schritt
  • oder einfach nur benutzen String.toCharArray()
Verwandte Themen