Java Range类的这种实现有什么问题
我有一个作业,我正在做一个电子表格,这是我的老师交给我的 我被要求实现一个名为Range的类,该类接受两个位置(每个位置由表示列和行的两个整数组成,例如新位置(1,2)),然后找到最低的行和列并构造一个包含这两个值的新位置,该位置是我的范围的左上角,行和列的最大值也是如此 然后,我被要求做一个类,它取一系列位置的总和。所以我决定,对于我的范围,它应该能够有一个方法,将所有位置放入ArrayList中,这就是getPositions()方法 在这里您可以看到该类的源代码:Java Range类的这种实现有什么问题,java,arraylist,nested-loops,Java,Arraylist,Nested Loops,我有一个作业,我正在做一个电子表格,这是我的老师交给我的 我被要求实现一个名为Range的类,该类接受两个位置(每个位置由表示列和行的两个整数组成,例如新位置(1,2)),然后找到最低的行和列并构造一个包含这两个值的新位置,该位置是我的范围的左上角,行和列的最大值也是如此 然后,我被要求做一个类,它取一系列位置的总和。所以我决定,对于我的范围,它应该能够有一个方法,将所有位置放入ArrayList中,这就是getPositions()方法 在这里您可以看到该类的源代码: package spre
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方法中指定this.a或this.b。在构造函数中需要它的原因是因为您在参数中指定了变量“a”和“b”,因此它需要范围引用。因为getPositions中不存在其他变量“a”或“b”,所以这是多余的@NikolayKuznetsov是的,我有点明白了,但我并不真正了解调试器。那么你有关于这个主题的任何学习资源的链接吗(最好是vidoes)?@Jodaka是因为它是一个实例变量,如果是的话,也许可以解释一下,因为我不确定我自己是否能看到这个问题。在getPositions()方法中声明一个局部变量,然后返回它会更好吗?非常感谢您的帮助!:)但是我不明白为什么我会得到每个位置两次。那么,为了避免这种情况,我应该纠正什么呢?你们似乎并没有得到每一个点两次,即使你们的代码和我的不同,你们已经用位置替换了点…啊,是的,好吧,我想,我现在可以看到问题了!所以第二个选项意味着每次我创建一个范围时,我也会创建一个包含该范围中所有位置的ArrayList?第三个,我有一个getter方法,只有当我的字段为null时,我才能创建它?那个字段会是ArrayList类型吗?非常感谢您对我的帮助,非常感谢!:)我列出了所有三个选项。顺便说一句:通常只有类以大写字母开头,而不是变量或字段。SogetPositions()时扩展
)调用了positionList
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; } }