如何在java中遇到空格时拆分String的arraylist?

时间:2014-09-06 10:00:32

标签: java arraylist split

我在ArrayList<String>

中有这样的输入
cat eats mouse

mouse eats cheese
cheese is tasty

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

我想把它转换为一个二维的String数组,它的维度为[no. of elements in 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
    }

告诉我,如果我不清楚。

4 个答案:

答案 0 :(得分:3)

你很亲密。在Java中,您不能使用空括号[]将新元素放在数组的末尾。以下代码可以解决问题。请注意,第二个数组中的元素数量限制为5.因此,在前5个单词之后,将忽略该行的其余部分。如果线条较短,则阵列末尾会有null个。

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
}

答案 1 :(得分:2)

更短,更高效的版本:

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;
}

您的代码中第一个名为 str 的数组没有任何关系,因为您可以直接从ArrayList访问字符串。

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

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

答案 2 :(得分:0)

将for循环更改为:

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

如果您知道自己只有3个单词,则不需要拥有5个元素,不要浪费资源。

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

此外,这种方式代码更清晰,更易于理解。如果您不需要,我同意 Ongy 删除array,但我现在无法告诉您,因为您说您将在以后更改此方法(至少返回值)

奖金:顺便说一下,名称strstr1lines不是这段代码的最佳选择,很容易成为困惑什么是什么。尝试找到更好的名称,例如linesArraywords,{{1}}或类似名称

答案 3 :(得分:0)

正如你在主题中提到的“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();}