java - 将二维矩阵转换为列的字符串数组(java)

标签 java

我对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/

相关文章:

java - 二维字符数组 java 的 "Not a statement"问题

java - 如何移动JPanel中图形的位置

java - 访问修饰符的可访问性

java - ElementCollection 的 JPQL 选择查询

Java 转换 : char[] array --> String

java - Android长字符串连接,

java - 如何将文本向左移动?

java - 在屏幕上查找 AffineTransform 原点

java - 使用 HtmlUnit 时出错

java - 如何在 Eclipse 中自动设置构建路径