2017-04-04 92 views
2

Java中是否有一種將空格分隔的值轉換爲char數組的簡單方法?從空格分隔的值中讀取一個字符數組

例如: 「A B C」 必須成爲[ 'A', 'B', 'C'];

我試圖

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

,但這返回一個Object []代替的char [],所以這是行不通的。

我知道我能做到這樣:

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

但我不知道是否有一個更直接的方法?

回答

1

主要問題是流不被認爲處理基本類型,如charbyte。您可以默認處理的唯一基元類型是int,long和double。所以,如果你想使用流和lambda表達式,你必須切換到每種類型的對象版本,在你的情況下,這個對象是Character

toArray()方法返回一個對象數組,你必須使用.collect(Collectors.toList()),它返回一個ArrayList

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

感謝解釋,這是非常有用的:) – Yangra

+0

:)謝謝。使用流處理原始類型與經典流程相比,創造了一些細微差別,有時會讓生活變得艱難 – freedev

0

使用流從您的代碼闡述,你可以使用一個Collector構建List

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

此外,如果您正在使用或願意使用Guava實用程序庫,你可以找到Splitter用於代替split方法(儘管它不能直接解決您的具體問題)。

+0

他們想要一個數組而不是列表(雖然我不知道爲什麼) – slim

1

爲什麼只需使用一個簡單的擴展您的解決方案,以去除空格?:

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

如果你可以用Character[]類型的數組生活,你可以用這個方法:

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

不幸的是,這並不char[]::new工作,所以如果你需要有原始char[]類型,您必須將數組轉換爲char[]之後。您可以使用Apache Commons Lang中的方法

ArrayUtils.toPrimitive(letters); 

或自己做

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

這應該工作:

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

但我可能會使用一個番石榴CharMatcher

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

當然:

char[] letters = scanner.nextLine().replace(" ", "").toCharArray(); 

請參閱KISS Principle

0

您的關鍵問題在於Stream本質上是一個對象流,而不是基元。

存在並行類型IntStream,LongStream,DoubleStream但是沒有CharStream

你可能會決定使用int,而不是char足夠你,你能做到這一點有:

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

注意,這是Java庫的設計不夠好:String.chars()返回IntStream

另外,您可以:

  • 寫自己Collector
  • 或轉換int[]char[]作爲單獨的步驟
  • 或者只是使用String.toCharArray()
相關問題