Java Range类的这种实现有什么问题

Java Range类的这种实现有什么问题,java,arraylist,nested-loops,Java,Arraylist,Nested Loops,我有一个作业,我正在做一个电子表格,这是我的老师交给我的 我被要求实现一个名为Range的类,该类接受两个位置(每个位置由表示列和行的两个整数组成,例如新位置(1,2)),然后找到最低的行和列并构造一个包含这两个值的新位置,该位置是我的范围的左上角,行和列的最大值也是如此 然后,我被要求做一个类,它取一系列位置的总和。所以我决定,对于我的范围,它应该能够有一个方法,将所有位置放入ArrayList中,这就是getPositions()方法 在这里您可以看到该类的源代码: package spre

我有一个作业,我正在做一个电子表格,这是我的老师交给我的

我被要求实现一个名为Range的类,该类接受两个位置(每个位置由表示列和行的两个整数组成,例如新位置(1,2)),然后找到最低的行和列并构造一个包含这两个值的新位置,该位置是我的范围的左上角,行和列的最大值也是如此

然后,我被要求做一个类,它取一系列位置的总和。所以我决定,对于我的范围,它应该能够有一个方法,将所有位置放入ArrayList中,这就是getPositions()方法

在这里您可以看到该类的源代码:

package spreadsheet;

import java.lang.Math;
import java.util.ArrayList;

public class Range {

    private Position a;
    private Position b;
    private ArrayList<Position> positionList;

    // Creates a new range, where it makes sure that the positions,
    // appear in the right order, where the first position is the position
    // of the upper left corner, and the second position is the lower right corner.
    public Range(final Position a, final Position b) {
        int minColumn = Math.min(a.getColumn(),b.getColumn());
        int minRow = Math.min(a.getRow(),b.getRow());

        int maxColumn = Math.max(a.getColumn(),b.getColumn());
        int maxRow = Math.max(a.getRow(),b.getRow());

        this.a = new Position(minColumn, minRow);
        this.b = new Position(maxColumn, maxRow);
        positionList = new ArrayList<>();       
    }


    public ArrayList<Position> getPositions() {
        int minColumn = this.a.getColumn();
        int minRow = this.a.getRow();
        int maxColumn = this.b.getColumn();
        int maxRow = this.b.getRow();
        for(int i = minColumn; i < maxColumn; i++) {
            for(int j = minRow; j < maxRow; j++) {
                positionList.add(new Position(i, j));
            }
        }
        return positionList;
    }   
}
软件包电子表格;
导入java.lang.Math;
导入java.util.ArrayList;
公共类范围{
私人职位a;
私人职位b;
私有ArrayList位置列表;
//创建一个新范围,确保位置,
//以正确的顺序出现,其中第一个位置是位置
//第二个位置是右下角。
公共范围(最终位置a、最终位置b){
int minColumn=Math.min(a.getColumn(),b.getColumn());
int minRow=Math.min(a.getRow(),b.getRow());
int maxColumn=Math.max(a.getColumn(),b.getColumn());
int maxRow=Math.max(a.getRow(),b.getRow());
此.a=新位置(minColumn,minRow);
此.b=新位置(maxColumn,maxRow);
positionList=新的ArrayList();
}
公共阵列列表getPositions(){
int minColumn=this.a.getColumn();
int minRow=this.a.getRow();
int maxColumn=this.b.getColumn();
int maxRow=this.b.getRow();
for(int i=minColumn;i

但问题是它实际上不起作用,它返回的列表是空的,这是为什么?有人能发现错误吗?

我看不出有什么理由不起作用。 好的,这里有几个问题:

  • positionList=newarraylist()将不会编译。它必须是
    positionList=new ArrayList()
  • 正如乔达卡所说,当你第二次得到这份名单上的每一个职位时,你会得到两次(当你称之为第四次时,会得到三次,以此类推)

  • 您的实现将包括第一列和第一行,但不包括最后一行(try
    i调试器可以发现错误。顺便说一句,如果它确实有效,您当前的实现将在每次
    getPositions()时扩展
    positionList
    )调用了
    。作为格式建议,不需要在getPositions方法中指定this.a或this.b。在构造函数中需要它的原因是因为您在参数中指定了变量“a”和“b”,因此它需要范围引用。因为getPositions中不存在其他变量“a”或“b”,所以这是多余的@NikolayKuznetsov是的,我有点明白了,但我并不真正了解调试器。那么你有关于这个主题的任何学习资源的链接吗(最好是vidoes)?@Jodaka是因为它是一个实例变量,如果是的话,也许可以解释一下,因为我不确定我自己是否能看到这个问题。在getPositions()方法中声明一个局部变量,然后返回它会更好吗?非常感谢您的帮助!:)但是我不明白为什么我会得到每个位置两次。那么,为了避免这种情况,我应该纠正什么呢?你们似乎并没有得到每一个点两次,即使你们的代码和我的不同,你们已经用位置替换了点…啊,是的,好吧,我想,我现在可以看到问题了!所以第二个选项意味着每次我创建一个范围时,我也会创建一个包含该范围中所有位置的ArrayList?第三个,我有一个getter方法,只有当我的字段为null时,我才能创建它?那个字段会是ArrayList类型吗?非常感谢您对我的帮助,非常感谢!:)我列出了所有三个选项。顺便说一句:通常只有类以大写字母开头,而不是变量或字段。So
    ArrayList点列表会更好;)好的,我终于成功了,非常感谢!!:)顺便说一句,在第三个示例中,您忘记了初始化构造函数中的字段,然后在get方法中,它必须是positionList.size()==0。再次感谢你,你是最棒的!没问题:)我明白了,我这里的复制粘贴失败了。我必须将点添加到
    calcPoints()
    中的本地列表中,而不是添加到字段中。固定的!
    package spreadsheet;
    
    import java.awt.Point;
    import java.util.ArrayList;
    
    public class Range {
    
    private final Point a;
    private final Point b;
    private final ArrayList<Point> PointList;
    
    // Creates a new range, where it makes sure that the Points,
    // appear in the right order, where the first Point is the Point
    // of the upper left corner, and the second Point is the lower right corner.
    public Range(final Point a, final Point b) {
        int minColumn = (int) Math.min(a.getX(),b.getX());
        int minRow = (int) Math.min(a.getY(),b.getY());
    
        int maxColumn =(int)  Math.max(a.getX(),b.getX());
        int maxRow = (int) Math.max(a.getY(),b.getY());
        this.a = new Point(minColumn, minRow);
        this.b = new Point(maxColumn, maxRow);
        PointList = new ArrayList<Point>();
    }
    
    public ArrayList<Point> getPoints() {
        int minColumn = (int) a.getX();
        int minRow = (int) a.getY();
        int maxColumn = (int) b.getX();
        int maxRow = (int) b.getY();
        for (int i = minColumn; i < maxColumn; i++) {
            for (int j = minRow; j < maxRow; j++) {
                PointList.add(new Point(i, j));
            }
        }
        return PointList;
    }
    
    package spreadsheet;
    
    import java.awt.Point;
    import java.util.ArrayList;
    
    import org.junit.Test;
    
        public class RangeTest {
    
        @Test
        public void testSomePoints() throws Exception {
            Range range = new Range(new Point(1, 1), new Point(5, 5));
            ArrayList<Point> points = range.getPoints();
            for (Point point : points) {
                System.out.println(point);
            }
        }
    }
    
    java.awt.Point[x=1,y=1]
    java.awt.Point[x=1,y=2]
    java.awt.Point[x=1,y=3]
    java.awt.Point[x=1,y=4]
    java.awt.Point[x=2,y=1]
    java.awt.Point[x=2,y=2]
    java.awt.Point[x=2,y=3]
    java.awt.Point[x=2,y=4]
    java.awt.Point[x=3,y=1]
    java.awt.Point[x=3,y=2]
    java.awt.Point[x=3,y=3]
    java.awt.Point[x=3,y=4]
    java.awt.Point[x=4,y=1]
    java.awt.Point[x=4,y=2]
    java.awt.Point[x=4,y=3]
    java.awt.Point[x=4,y=4]
    
    public class Range {
    
        private final Point a;
        private final Point b;
        private final ArrayList<Point> PointList;
    
        public Range(final Point a, final Point b) {
            int minColumn = (int) Math.min(a.getX(),b.getX());
            int minRow = (int) Math.min(a.getY(),b.getY());
    
            int maxColumn =(int)  Math.max(a.getX(),b.getX());
            int maxRow = (int) Math.max(a.getY(),b.getY());
            this.a = new Point(minColumn, minRow);
            this.b = new Point(maxColumn, maxRow);
        }
    
        public ArrayList<Point> getPoints() {
            PointList = new ArrayList<Point>();
            int minColumn = (int) a.getX();
            int minRow = (int) a.getY();
            int maxColumn = (int) b.getX();
            int maxRow = (int) b.getY();
            for (int i = minColumn; i < maxColumn; i++) {
                for (int j = minRow; j < maxRow; j++) {
                    PointList.add(new Point(i, j));
                }
            }
            return PointList;
        }
    }
    
    public class Range {
    
        private final Point a;
        private final Point b;
        private final ArrayList<Point> PointList;
    
        public Range(final Point a, final Point b) {
            int minColumn = (int) Math.min(a.getX(),b.getX());
            int minRow = (int) Math.min(a.getY(),b.getY());
    
            int maxColumn =(int)  Math.max(a.getX(),b.getX());
            int maxRow = (int) Math.max(a.getY(),b.getY());
            this.a = new Point(minColumn, minRow);
            this.b = new Point(maxColumn, maxRow);
            PointList = calcPoints();
        }
    
        private ArrayList<Point> calcPoints() {
            ArrayList<Point> list = new ArrayList<Point>();
            int minColumn = (int) a.getX();
            int minRow = (int) a.getY();
            int maxColumn = (int) b.getX();
            int maxRow = (int) b.getY();
            for (int i = minColumn; i < maxColumn; i++) {
                for (int j = minRow; j < maxRow; j++) {
                    PointList.add(new Point(i, j));
                }
            }
            return list;
        }
    
        public ArrayList<Point> getPoints() {
            return PointList;
        }
    }
    
    public class Range {
    
        private final Point a;
        private final Point b;
        private final ArrayList<Point> PointList;
    
        public Range(final Point a, final Point b) {
            int minColumn = (int) Math.min(a.getX(),b.getX());
            int minRow = (int) Math.min(a.getY(),b.getY());
    
            int maxColumn =(int)  Math.max(a.getX(),b.getX());
            int maxRow = (int) Math.max(a.getY(),b.getY());
            this.a = new Point(minColumn, minRow);
            this.b = new Point(maxColumn, maxRow);
        }
    
        private ArrayList<Point> calcPoints() {
            ArrayList<Point> list = new ArrayList<Point>();
            int minColumn = (int) a.getX();
            int minRow = (int) a.getY();
            int maxColumn = (int) b.getX();
            int maxRow = (int) b.getY();
            for (int i = minColumn; i < maxColumn; i++) {
                for (int j = minRow; j < maxRow; j++) {
                    list.add(new Point(i, j));
                }
            }
            return list;
        }
    
        public ArrayList<Point> getPoints() {
            if(PointList == null) {
                PointList = calcPoints();
            }
            return PointList;
        }
    }