Java 从空格分隔的值中读取字符数组
Java中有没有一种简单的方法可以将空格分隔的值转换为字符数组 例如:“abc”必须变成['a','b','c'] 我试过了Java 从空格分隔的值中读取字符数组,java,Java,Java中有没有一种简单的方法可以将空格分隔的值转换为字符数组 例如:“abc”必须变成['a','b','c'] 我试过了 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);
char[] letters = Arrays.stream(scanner.nextLine().split(" "))
.map(a->a.charAt(0)).toArray();
,但这将返回一个对象[],而不是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]);
}
}
Scanner Scanner=新的扫描仪(System.in);
ArrayList字母=新的ArrayList();
char[]line=scanner.nextLine().tocharray();
对于(int i=0;i
但是我想知道有没有更直接的方法?主要的问题是,流被认为不能处理诸如
char
或byte
之类的原语类型。默认情况下,您可以处理的唯一基本类型是int、long和double。因此,如果您想使用streams和Lambda,您必须为每种类型切换到对象版本,在您的例子中,这就是字符
对象
toArray()
方法返回一个对象数组,您必须使用.collect(collector.toList())
它返回一个ArrayList
List<Character> collect = Arrays.stream(scanner.nextLine().split(" "))
.map(a -> new a.charAt(0)).collect(Collectors.toList());
List collect=Arrays.stream(scanner.nextLine().split(“”))
.map(a->new a.charAt(0)).collect(Collectors.toList());
使用流对代码进行细化,您可以使用收集器来构建列表
:
ArrayList<Character> letters = Arrays.stream(scanner.nextLine().split(" "))
.map(a->a.charAt(0)).collect(Collectors.toList());
ArrayList letters=Arrays.stream(scanner.nextLine().split(“”))
.map(a->a.charAt(0)).collect(Collectors.toList());
此外,如果您正在使用或愿意使用该实用程序库,您可以使用split
方法代替它(尽管它不能直接解决您的特定问题)。为什么只使用带有简单扩展的解决方案来删除空白
char[] letters = scanner.nextLine().replaceAll("\s","").toCharArray();
如果您可以使用字符[]
类型的数组,则可以使用以下方法:
Character[] letters = Arrays.stream(scanner.nextLine().split(" ")).map(a -> a.charAt(0)).toArray(Character[]::new);
不幸的是,这不适用于char[]::new
,因此如果需要原语char[]
类型,则必须在之后将数组转换为char[]
。您可以使用ApacheCommonsLang的方法
ArrayUtils.toPrimitive(letters);
还是你自己做
char[] a = new char[letters.length];
for (int i = 0; i < letters.length; i++) {
a[i] = letters[i];
}
char[]a=新字符[letters.length];
for(int i=0;i
这应该可以:
char[] letters = Arrays.stream(scanner.nextLine().split("\\s+"))
.collect(Collectors.joining(""))
.toCharArray();
但我可能会用番石榴:
当然可以:
请参阅。您这里的关键问题是流
本质上是一个对象流,而不是原语流
有并行类型IntStream
,LongStream
,DoubleStream
,但没有CharStream
您可能会认为使用int
而不是char
就足够了,您可以使用以下方法:
int[] letters = Arrays.stream(scanner.nextLine().split(" "))
.mapToInt( a-> (int) a.charAt(0))
.toArray();
请注意,这对于Java库的设计者来说已经足够了:String.chars()
返回一个IntStream
或者,您可以:
- 编写自己的
收集器
- 或者将
int[]
转换为char[]
作为一个单独的步骤
- 或者只使用String.toCharArray()
他们想要的是数组而不是列表(虽然我不知道为什么),谢谢你的解释,这非常有用:):)谢谢。使用流处理原始类型与经典流相比没有什么细微差别,而经典流有时会让生活变得艰难
char[] letters = scanner.nextLine().replace(" ", "").toCharArray();
int[] letters = Arrays.stream(scanner.nextLine().split(" "))
.mapToInt( a-> (int) a.charAt(0))
.toArray();