将2D矩阵转换为字符串数组(java)

时间:2013-03-10 20:29:46

标签: java

我对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, "");脱离班轮

2 个答案:

答案 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();

}