我对java中的ArrayLists了解不多。我需要解决以下问题:如何制作二维矩阵列的 array[] 。输入文件是:
V G V VV G V V V
E F V VF E V E V
VVVVVVVVV
A A V VA G V A D
V D V VD E V V V
A V V VV V V A V
Stringarray liner
所需的格式(见下文)是:
{"VEVAVA","GFVADV","VVVVVV","VVVFVVVAVDVV","GEVGEV","VVVVVV","VEVAVA","VVVDVV"}
我的代码是:
ArrayList<String[]> mat = new ArrayList<String[]>();
Scanner scan = new Scanner(new File("internal2"));
String[] liner = new String[m];
while (scan.hasNextLine()) {
Scanner colReader2 = new Scanner(scan.nextLine());
while(colReader2.hasNext())
{
for(int i = 0; i<m; i++) {
liner[i] = colReader2.next();
//System.out.println(liner[i]);
mat.add(liner);
}
}
// scan.nextLine();
}
这样做的目的是我想在liner
中搜索这些字符串。现在程序似乎只给出这样的liner
:
{"A","V","V","VV","V","V","A","V"}
这是输入文件的最后一行。我希望你能帮助我。
编辑
我的代码继续:
Pattern pattern = Pattern.compile("[A-G]+");
Pattern pattern2 = Pattern.compile("[V]+");
String[][] matrix4 = mat.toArray(new String[n][m]);
for (int i = 0; i < m; i++) {
StringBuffer sf = new StringBuffer();
for (int j = 0; j < n; j++) {
sf.append(matrix4[j][i]);
}
Matcher matcher = pattern.matcher(sf.toString());
Matcher matcher2 = pattern2.matcher(sf.toString());
if (matcher.find()) {
System.out.println("R");
} else if (matcher2.matches()) {
System.out.println("Q");
}
}
因此,对于 liner
中至少包含 1 次 A-G
出现的列字符串,必须打印 R
。对于仅包含 V
的列字符串,它必须打印 Q
。那么输出应该是:
R
R
Q
R
R
Q
R
R
但这不是我得到的。你们有人知道我做错了什么吗?
已解决:
我必须使用 Arrays.fill(liner, ""); 来将
null
从衬垫中取出
最佳答案
Scanner.next()
仅扫描字符直到下一个空格。如果您想扫描整行,请使用 Scanner.nextLine()
,它应该为您提供 “V G V VV G V V V”
。要删除字符之间的空格,请使用 String.replaceAll("\s", "")
。
更新:抱歉,我误解了您的问题。
要获得所需的输出,请将 liner[i] = colReader2.next()
更改为 liner[i] += colReader2.next()
这应该将一个字符附加到数组条目而不是替换它。
更新#2:我测试了您的代码片段并发现了一些问题。
liner[i]
未使用空字符串初始化,这会导致输出nullVEVAVA
等等...我没有检查这一点,抱歉.- 您不需要使用两台扫描仪,一台就足够了。
mat.add(liner)
仅添加对数组的引用,因此如果更改该数组,这些更改也将在 ArrayList 中可见- 一般来说,最好先解析输入文件,然后创建一个数组,因为您不必知道尺寸
假设您想要一个字符串数组的 ArrayList 来保存输入的列(我假设它不是锯齿状的),这应该可以做到(好吧,至少它给了我所需的输出):
ArrayList<String[]> input = new ArrayList<String[]>(); Scanner sc = new Scanner(new File("input")); // read the input while (sc.hasNextLine()) { input.add(sc.nextLine().split("\\s")); } sc.close(); // this only works if your input isn't jagged! String[][] mat = new String[input.get(0).length][]; // transform your matrix from [line][column] to [column][line] for (int i = 0; i < input.size(); i++) { for (int j = 0; j < input.get(i).length; j++) { if (mat[j] == null) { mat[j] = new String[input.size()]; } if (mat[j][i] == null) { mat[j][i] = ""; } mat[j][i] += input.get(i)[j]; } } Pattern pattern = Pattern.compile("[A-G]+"); Pattern pattern2 = Pattern.compile("[V]+"); for (int i = 0; i < mat.length; i++) { StringBuilder sb = new StringBuilder(); for (int j = 0; j < mat[i].length; j++) { sb.append(mat[i][j]); } Matcher matcher = pattern.matcher(sb.toString()); Matcher matcher2 = pattern2.matcher(sb.toString()); if (matcher.find()) { System.out.println("R"); } else if (matcher2.matches()) { System.out.println("Q"); } }
如果这仍然没有帮助,我很抱歉,但我的时间和你的时间一样宝贵,我相信你可以通过做一些像样的研究来解决许多问题。但是,如果您真的遇到困难,只需回来问另一个问题,我们将很乐意帮助您;)
关于java - 将二维矩阵转换为列的字符串数组(java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15327209/