从空格分隔的值

时间:2017-04-04 08:43:35

标签: java

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

但我想知道是否有更直接的方法?

7 个答案:

答案 0 :(得分:1)

主要问题是流不被认为处理类型为charbyte的原语。默认情况下,您可以处理的唯一原语类型是int,long和double。因此,如果你想使用流和lambda,你必须切换到每种类型的Object版本,在你的情况下是Character对象。

toArray()方法返回一个对象数组,您必须使用.collect(Collectors.toList())返回ArrayList

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

答案 1 :(得分:1)

为什么只使用带有简单扩展名的解决方案来移除空格?:

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

答案 2 :(得分:0)

使用流式解析您的代码,您可以使用Collector构建List

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

此外,如果您正在使用或愿意使用Guava实用程序库,您可以找到Splitter代替split方法(虽然它不能直接解决您的问题)具体问题)。

答案 3 :(得分:0)

如果您可以使用Character[] letters = Arrays.stream(scanner.nextLine().split(" ")).map(a -> a.charAt(0)).toArray(Character[]::new); 类型的数组,则可以使用此方法:

char[]::new

不幸的是,这不适用于char[],因此如果您需要原始char[]类型,则必须在之后将数组转换为ArrayUtils.toPrimitive(letters); 。您可以使用Apache Commons Lang的方法

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

或自己动手

SELECT Type, Sum(Amount)
  FROM (
       SELECT C.Amount - ISNULL(D.Amount, 0) AS Amount, C.Type
         FROM Credits C
    LEFT JOIN (SELECT Id, Sum(Amount) 
                 FROM Debits 
               GROUP BY ID) D ON C.Id = D.Id
  ) A
 GROUP BY A.Type

答案 4 :(得分:0)

这应该有效:

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

但我可能会使用番石榴CharMatcher

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

答案 5 :(得分:0)

不确定

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

请参阅KISS Principle

答案 6 :(得分:0)

这里的关键问题是Stream本质上是一个对象流,而不是基元。

有并行类型IntStreamLongStreamDoubleStream,但没有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()