0

我正在尝试将此数组更改为 arrayList。它读取线的两点的 x 和 y 坐标以及线的颜色。稍后我将使用 equals() 方法来确定两行是否相等,并且只添加第一行。现在我只是想将文件放入arrayList。如果我只使用数组 Line[]lines,程序运行良好,但是当我像这样运行它时,使用 arrayList,它只是一个空白面板,这是第二个循环用于导致 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 回答