2017-04-04 64 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()
相关问题