【问题标题】:how to split an arraylist of String whenever a space is encountered in java?每当在java中遇到空格时如何拆分String的arraylist?
【发布时间】:2014-09-06 10:00:32
【问题描述】:

我在ArrayList<String> 中有这样的输入:

cat eats mouse

mouse eats cheese
cheese is tasty

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

我想将它转换成二维字符串数组,其尺寸为[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
    }

如果我不清楚,请告诉我。

【问题讨论】:

    标签: java arraylist split


    【解决方案1】:

    你很接近。在 Java 中,您不能使用空括号 [] 将新元素放在数组的末尾。下面的代码做的事情。请注意,第二个数组中的元素数量限制为 5。因此,在前 5 个单词之后,该行的其余部分将被忽略。如果该行较短,则数组末尾会有nulls。

    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
    }
    

    【讨论】:

    • 我不知道为什么但 str.split() 显示错误:Cannot invoke split(String) on the array type String[]
    • 另外,更好的做法是将数组声明为String[] str,而不是String str[]
    • 是的,我会这样做.. 但我如何删除该错误/
    • 为什么是 5?为什么要使用循环复制字符串而不是仅从 split() 分配引用?
    • 我做到了:String parts[] = str[i].split("\\s+"); 感谢您的帮助!
    【解决方案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 个字符串分配空间?

    【讨论】:

    • 除非您不需要一维的str 数组,否则这可能会更好。我从新手的代码开始,同时给出答案以显示必须进行哪些必要的更改
    • 我明白你做了什么,正如我所说,我认为你的回答是正确的,我只是想指出,有一种方法可以更有效地做到这一点,因为@Newbie似乎是新人,可能已经这样做了,因为他不知道get()函数
    • 谢谢我会试试这个.. +1 的帮助
    • 我实际上需要 5 个元素,但为了简单起见,我在这里提到了 3 个元素,以便我可以更短的方式显示输入和所需的输出..
    【解决方案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();}
    

    【讨论】:

    • 我已经在arraylist的主函数中读取了文件内容。我正在将它传递给这个函数
    【解决方案4】:

    将你的 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] 也是如此。类型匹配。

    另外,这样代码更清晰,更容易理解。我同意Ongy在你不需要的时候删除str,但我现在不能说,因为你说你以后要改变这个方法(至少是返回值)

    奖励:顺便说一句,名称arraystrstr1 不是那段代码的最佳选择,真的很容易混淆什么是什么。尝试找到更好的名称,例如 lineslinesArraywords 或类似的名称

    【讨论】:

    • 当然..我会这样做.. :)
    猜你喜欢
    • 2019-02-03
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多