我对java中的ArrayLists知之甚少。我需要一个解决方案来解决以下问题:如何制作2D矩阵列的数组[]。输入文件是:
V G V VV G V V V
E F V VF E V E V
V V V VV V V V V
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”}
这是inputfile的最后一行。我希望你能帮助我。
修改
我的代码继续:
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
中至少包含A-G
的{1}}的一个列字符串,必须打印R
。对于仅包含V
的列字符串,它必须打印Q
。输出应该是:
R
R
Q
R
R
Q
R
R
但这不是我得到的。你们有谁知道我做错了吗?
解决:
我必须使用null
Arrays.fill(liner, "");
脱离班轮
答案 0 :(得分:0)
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");
}
}
如果这仍然没有帮助,我很抱歉,但我的时间和你的一样宝贵,我相信你可以通过做一些体面的研究来解决许多问题。但是,如果你真的卡住,只需回来问另一个问题,我们会乐意帮助你;)
答案 1 :(得分:0)
在数组列表中使用StringBuilder并附加到它。我想在开始接受值之前,矩阵的大小是已知的吗?
不确定您的期望List<StringBuilder[]> mat = new ArrayList<StringBuilder[]>();//better to declare as list, array list is 1 implementation
Scanner scan = new Scanner(new File("internal2"));
int col = 0;
while (scan.hasNextLine()) {
col = 0;
Scanner colReader2 = new Scanner(scan.nextLine());
while(colReader2.hasNext())
{
if(mat.size() < (col + 1)){
mat.add(new StringBuilder());
}
//mat.get(col).substring(mat.get(col).length() - 1);
mat.get(col).append(colReader2.next())
}
}
// scan.nextLine();
}