在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]);
}
}
但我想知道是否有更直接的方法?
答案 0 :(得分:1)
主要问题是流不被认为处理类型为char
或byte
的原语。默认情况下,您可以处理的唯一原语类型是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)
答案 6 :(得分: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[]
作为单独的步骤