1

私はJavaのArrayListsについてあまり知識がありません。次の問題の解決策が必要です。2D行列の列のarray[]を作成する方法。入力ファイルは次のとおりです。

VGV VV GVVV
EFV VF
EVEV VVV VV VVVV
AAV VA GVAD
VDV VD EVVV
AVV VV VVAV

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-GR印刷する必要があります。Vまた、 'sのみを含む列文字列の場合は、を出力する必要がありますQ。その場合、出力は次のようになります。

R
R
Q
R
R
Q
R
R

しかし、これは私が得るものではありません。私が間違っていることを知っている人はいますか?

解決済み:

nullを使用してライナーからsを取り出さなければなりませんでしたArrays.fill(liner, "");

4

2 に答える 2

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

}

于 2013-03-10T20:48:58.543 に答える
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いません...私はそれをチェックしませんでした、申し訳ありません。
  • スキャナーを 2 つ使用する必要はありません。1 つあれば十分です。
  • 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");
        }
    }
    

それでも問題が解決しない場合は、申し訳ありませんが、私の時間はあなたの時間と同じくらい貴重です。適切な調査を行うことで、多くの問題を解決できると確信しています。ただし、本当に行き詰まった場合は、戻って別の質問をしてください。喜んでお手伝いします ;)

于 2013-03-10T20:39:29.723 に答える