2017-04-04 20 views
2

スペースで区切られた値をchar配列に変換する簡単な方法はありますか?スペースで区切られた値から文字の配列を読み取る

例: "a b c"は['a'、 'b'、 'c']にする必要があります。

Iは

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

を試みたが、これは[] []の代わりに文字のオブジェクトを返し、それが機能しません。

私はこのようにそれを行うことができます知っている:

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

ストリームは、charまたはbyteのようなプリミティブ型を処理するとは考えられません。デフォルトで処理できる唯一のプリミティブ型はint、long、doubleです。したがって、ストリームとラムダを使用する場合は、それぞれのタイプのオブジェクトバージョン(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

、あなたがListを構築するためにCollectorを使用することができます。

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

また、ケースであなたは、あなたは、可能性が使用したりGuavaユーティリティライブラリを使用して喜んでいますsplitメソッドの代わりにSplitterが便利です(特定の問題を直接解決するわけではありませんが)。

+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のラングの方法

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を使用すると、あなたのために十分である、とあなたがそれを行うことができることを決めるかもしれません:これはJavaライブラリの設計者のために十分であることを

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

注:IntStreamを返しString.chars()

は、別の方法としては、可能性:

  • は、あなた自身のCollector
  • を書いたり、別のステップとしてchar[]
  • int[]を変換するか、単にString.toCharArrayを()のための
関連する問題