Java 从空格分隔的值中读取字符数组

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(); ,但这将返回一

Java中有没有一种简单的方法可以将空格分隔的值转换为字符数组

例如:“abc”必须变成['a','b','c']

我试过了

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();