0

この配列をarrayListに変更しようとしています。線の 2 点の x 座標と y 座標と線の色を読み取ります。後で equals() メソッドを使用して、2 つの行が等しいかどうかを判断し、最初の行のみを追加します。今のところ、ファイルをarrayListに入れようとしています。配列 Line[]lines だけを使用すると、プログラムは正常に実行されますが、arrayList を使用してこのように実行すると、2 番目のループが arrayList に何も存在しないようにするための空白のパネルにすぎません。

私のテキストファイルは次のようになります。

3   
482 22 335 492 red  
482 22 335 492 blue  
482 22 335 492 green

//Line[] lines;
ArrayList<Line> lines;
Scanner reader;

int numLines = reader.nextInt();
    //lines = new Line[numLines];
    ArrayList<Line>lines = new ArrayList<Line>();

while( reader.hasNext() ) {
        for( int i = 0; i < numLines; i++ ) {
            int x = reader.nextInt();
            int y = reader.nextInt();
            Point beg = new Point(x,y);
            x = reader.nextInt();
            y = reader.nextInt();
            Point end = new Point(x,y);

            String color = reader.next();

            Line l =  new Line( beg, end, color );
            lines.add(l); 
            //lines[i] = l;

このループを使用して、各行をarrayListに追加しようとしています

if( lines != null ) {
        for( Line l: lines ) {
            int x1 = l.getBeg().getX();
            int y1 = l.getBeg().getY();
            int x2 = l.getEnd().getX();
            int y2 = l.getEnd().getY();

            g.setColor(l.color);
            g.drawLine(x1, y1, x2, y2);

            System.out.println(l);

これはペイント コンポーネントです。リストが空の場合、パネルは空白のままになります。

私の質問は、最初のループを正しく使用していますか、それとも arrayList を操作するために必要なことはありますか?

4

1 に答える 1

1

さらにコンテキストがなければ、変数をシャドウイングしているように見えます...

インスタンス変数に「現れる」これらの宣言から始めます...

//Line[] lines;
ArrayList<Line> lines;
Scanner reader;

しかし、それらを初期化するときは、これを行います...

int numLines = reader.nextInt();
//lines = new Line[numLines];
ArrayList<Line>lines = new ArrayList<Line>();
// Warning bells, redeclaration of lines!!

これは、変数をシャドウイングしていることを「示唆」します。つまり、ペイント メソッドがlines、クラス レベルで宣言した参照を使用していることを意味します。

代わりに、変数を次のように初期化する必要があります...

int numLines = reader.nextInt();
//lines = new Line[numLines];
lines = new ArrayList<Line>(numLines);

注意してください。を使用してnumLinesを初期化するArrayListと、より効率的になります...

于 2013-09-05T03:56:10.497 に答える