如何在java中遇到空格时拆分字符串的arraylist?

如何在java中遇到空格时拆分字符串的arraylist?,java,arraylist,split,Java,Arraylist,Split,我在数组列表中有这样一个输入: (应忽略空行,因为我将从文件中读取此输入) 我想把它转换成一个二维字符串数组,它的维数为[ArrayList中的元素数][3] 3号是固定的,即每个句子有3个单词。 像这样: "cat" "eats" "mouse" "mouse" "eats" "cheese" "cheese" "is" "tasty" 以下是我尝试过的: public static int processData(ArrayList<String> arra

我在
数组列表中有这样一个输入:

(应忽略空行,因为我将从文件中读取此输入)

我想把它转换成一个二维字符串数组,它的维数为
[ArrayList中的元素数][3]

3号是固定的,即每个句子有3个单词。 像这样:

"cat"    "eats" "mouse"
"mouse"  "eats" "cheese"
"cheese" "is"   "tasty"
以下是我尝试过的:

    public static int processData(ArrayList<String> array)
    {
        String str[]=new String[array.size()];
        array.toArray(str);

        String str1[][]=new String[str.length][5];
        for(int i=0;i<str.length;i++)
        {
                str1[i][]=str.split("\\s+");    //i want to do something like this, but this is showing errors.

        }

        return 0; //this is temporary, I will be modifying it
    }
publicstaticintprocessdata(arraylistarray)
{
String str[]=新字符串[array.size()];
数组。toArray(str);
字符串str1[][]=新字符串[str.length][5];

对于(inti=0;i您就接近了。在Java中,您不能使用空括号将新元素放在数组的末尾
[]
。下面的代码就是这样做的。请注意,第二个数组中的元素数限制为5。因此,在前5个字之后,该行的其余部分将被忽略。如果该行较短,则数组末尾将出现
null
s

public static int processData(ArrayList<String> array) {
    String[] str = new String[array.size()];
    array.toArray(str);

    String[][] str1 = new String[str.length][3];

    for(int i=0; i < str.length; i++) {
        String[] parts = str[i].split("\\s+");

        for(int j = 0; j < parts.length || j < 3; j++) {
            str1[i][j] = parts[j];
        }
    }

    // do something next
}
publicstaticintprocessdata(arraylistarray){
String[]str=新字符串[array.size()];
数组。toArray(str);
字符串[][]str1=新字符串[str.length][3];
对于(int i=0;i
更短、更高效的版本:

static int processData(ArrayList<String> array)
{
    String str[][] = new String[array.size()][3];
    for(int i = 0; i < str.length; ++i) {
        str[i] = array.get(i).split("\\s+");
    }
    return 0;
}
静态int-processData(ArrayList数组)
{
字符串str[][]=新字符串[array.size()][3];
对于(int i=0;i
代码中第一个名为str的数组没有理由,因为您无法直接从ArrayList访问字符串

另外,您不必复制字符串,只需将字符串数组放入数组数组中,就像在我的代码中一样


另外,如果固定大小为3,并且不需要再向数组中添加任何内容,为什么要为5个字符串分配空间?

将for循环更改为:

String str1[][] = new String[str.length][3];
for(int i = 0; i < str.length; i++) {
    str1[i] = str[i].split("\\s+");    
}
String str1[][]=新字符串[str.length][3];
对于(int i=0;i
你不需要有5个元素,如果你知道你只有3个单词,不要浪费你的资源

str
String[]
str[i]
String
str[i].split()
String[]
也是
str1[i]
。类型匹配

另外,这样代码更清晰、更容易理解。如果您不需要,我同意Ongy删除
str
,但我现在说不出来,因为您说稍后将更改此方法(至少返回值)

奖金:顺便说一句,名称
数组
str
str1
不是这段代码的最佳选择,很容易混淆什么是什么。试着找到更好的名称,例如
单词
,或者类似的东西,就像你提到的“arraylist”主题:

try{
    BufferedReader br = new BufferedReader(new FileReader("filename"));
    Arraylist<String[]> l = new ArrayList<String[]>();
    String line;
    while((line = br.readline) != null)
      l.add(line.split("\\s+");

    br.close();
}catch(Exception e){e.printStackTrace();}
试试看{
BufferedReader br=新的BufferedReader(新文件读取器(“文件名”);
Arraylist l=新的Arraylist();
弦线;
while((line=br.readline)!=null)
l、 添加(行分割(\\s+);
br.close();
}catch(异常e){e.printStackTrace();}

我不知道为什么,但是str.split()显示错误:
无法对数组类型String[]调用split(String)
另外,更好的做法是将数组声明为
String[]str
,而不是
String str[]
。是的,我会这样做。。但是如何删除该错误/为什么是5?为什么要用循环复制字符串,而不是从split()分配引用?我这样做:
String parts[]=str[I]。split(\\s+))
谢谢你的帮助!除非你不需要一维
str
数组,否则这可能会更好。我从新手的代码开始,同时给出答案,说明必须进行哪些必要的更改。我理解你所做的,正如我所说的,我认为你的答案是正确的,我只是想指出,有一种方法可以做到这一点效率要高一点,因为@Newbie似乎是新来的,可能已经这样做了,因为他不知道
get()
function谢谢,我将尝试使用此..+1来提供帮助我实际上需要5个元素,但为了简单起见,我在这里提到了3个元素,以便以更短的方式显示输入和所需的输出..我已经在arraylist中读取了主函数中的文件内容..我正在将其传递给此函数确定..我将这样做...)
try{
    BufferedReader br = new BufferedReader(new FileReader("filename"));
    Arraylist<String[]> l = new ArrayList<String[]>();
    String line;
    while((line = br.readline) != null)
      l.add(line.split("\\s+");

    br.close();
}catch(Exception e){e.printStackTrace();}