从空格分隔的值中读取一个字符数组
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]);
}
}
但我不知道是否有一个更直接的方法?
主要问题是流不被认为处理基本类型,如char
或byte
。您可以默认处理的唯一基元类型是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());
为什么只需使用一个简单的扩展您的解决方案,以去除空格?:
char[] letters = scanner.nextLine().replaceAll("\s","").toCharArray();
如果你可以用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];
}
这应该工作:
char[] letters = Arrays.stream(scanner.nextLine().split("\\s+"))
.collect(Collectors.joining(""))
.toCharArray();
但我可能会使用一个番石榴CharMatcher
:
char[] letters = CharMatcher.WHITESPACE.removeFrom(scanner.nextLine())
.toCharArray();
您的关键问题在于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()
感谢解释,这是非常有用的:) – Yangra
:)谢谢。使用流处理原始类型与经典流程相比,创造了一些细微差别,有时会让生活变得艰难 – freedev