我在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
}
告诉我,如果我不清楚。
答案 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个元素,不要浪费资源。
str
是String[]
,str[i]
是String
,str[i].split()
是String[]
,str1[i]
也是str
。类型匹配。
此外,这种方式代码更清晰,更易于理解。如果您不需要,我同意 Ongy 删除array
,但我现在无法告诉您,因为您说您将在以后更改此方法(至少返回值)
奖金:顺便说一下,名称str
,str1
,lines
不是这段代码的最佳选择,很容易成为困惑什么是什么。尝试找到更好的名称,例如linesArray
,words
,{{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();}