Java成对列表
我正在尝试创建一个整数对列表。我想我的基本想法是对的,但每当我尝试向列表中添加一对新的时,我都会出错 这是我的Java成对列表,java,list,class,Java,List,Class,我正在尝试创建一个整数对列表。我想我的基本想法是对的,但每当我尝试向列表中添加一对新的时,我都会出错 这是我的配对课程: public class Pair<L,R> { private L l; private R r; public Pair(L l, R r){ this.l = l; this.r = r; } public L getL(){ return l; } public R getR(
配对
课程:
public class Pair<L,R> {
private L l;
private R r;
public Pair(L l, R r){
this.l = l;
this.r = r;
}
public L getL(){ return l; }
public R getR(){ return r; }
public void setL(L l){ this.l = l; }
public void setR(R r){ this.r = r; }
}
有人认为我这样做有什么明显的错误吗?我觉得我可能错过了一些简单的东西,但我不知道是什么错了。我觉得我添加的新配对不正确。试试看
DominoList.add(new Pair(0, 0));
您还可以将内置类
AbstractMap.SimpleEntry
用作结对类,而不是自定义类。其他语言对简单元组有更好的支持,顺便说一句。您应该调用构造函数来创建一个新的对实例。
使用
你说你想要一对整数。那么您不应该使用
Short
而是Integer
。除了其他答案(这些答案都是正确的)之外,我要提到Java中有一种常见的模式,即使用静态构造函数,而不是直接使用new
;即:
public class Pair<L, R> {
// other code
public static <L, R> Pair<L, R> of(L left, R right) {
return new Pair(left, right);
}
}
如果您想探索它,还有一个库提供这一功能:。您需要在结对类之前插入
new
关键字来创建一个新的类实例,正如其他人提到的那样
因此,您的代码应该是:
private final List<Pair<Short,Short>> dominoList = new ArrayList<>();
dominoList.add(new Pair(0, 0));
private final List dominoList=new ArrayList();
添加(新的一对(0,0));
这有一些小的变化,我认为值得一提
首先,如果您使用的是Java7或Java8,则不需要在两侧显式使用泛型类型
还请注意,最好在变量中引用接口,而不是具体类型。在这种情况下,最好使用List
而不是ArrayList
。通过这样做,您可以在以后更改列表实现,例如,使用与ArrayList
具有不同性能属性的LinkedList
private L l;
private R r;
public Pair(L l, R r){
其次,由于您是在声明时初始化变量,因此将其标记为final
也是一种良好的做法。通过这样做,您可以帮助编译器优化字节码,如果不必要地将新实例分配给变量,还可以获得一些反馈
在您的特定情况下,您可能还希望查看其他集合,如Map
。您可以轻松地将一个整型键映射到另一个整型值,但在选择映射实现时要小心,因为例如,HashMap
不允许重复的键
以下是一些提示:
- 约书亚·布洛赫的《有效的Java》
- Maurice Naftalin和Philip Wadler的Java泛型和集合
L
的类和一个名为R
的类。但显然你没有。实际上,您正在存储一对Short
对象,因此请指定Short
private L l;
private R r;
public Pair(L l, R r){
…应该是
private Short key ;
private Short value ;
public Pair( Short key , Short value ){
另一个命名问题:Java约定使用大写字母命名类,而实例变量则使用小写字母开头命名。因此:
private ArrayList<Pair<Short,Short>> DominoList = new…
关于上面代码片段的另一件事:如果更通用的接口提供后续代码所需的所有行为,通常我们使用List
或左侧。这是的一个方面,允许您在将来将ArrayList
替换为其他List
实现,而无需更改或中断使用该列表的任何其他代码
Map.Entry
我可能错过了一些简单的东西
更简单的方法是使用内置到Java中的现有类。有些人将接口的任一实现用作pair类:
List < AbstractMap.SimpleImmutableEntry < Short, Short > > dominoList = new ArrayList <>( 28 );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 0 , 0 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 0 , 1 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 1 , 1 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 0 , 2 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 1 , 2 ) );
当然,有些人会认为使用<代码>条目.map <代码>是一个黑客行为。这些类用于
地图
。但是没有任何技术原因禁止您单独使用entry类
如果您使用这些数字对作为映射,第一个是第二个的名称或标识符,那么我建议您实际使用映射
实现,而不是列表
。但我怀疑你不是
Domino
class
如果您试图建模,那么您真的应该定义自己的Domino
类。不仅要表示这对数字,还可以使用其他方法,如isDouble
如果你正在构建一个更大的环境,让这些多米诺骨牌出现在其中,比如一个游戏,那么拥有一个特定的命名类会使你的代码更加复杂。这很有意义,我忘记了必须构建每一对。谢谢你的回答@德克萨斯州布鲁斯,那评论有什么意义?这对讨论没有任何补充。
private Short key ;
private Short value ;
public Pair( Short key , Short value ){
private ArrayList<Pair<Short,Short>> DominoList = new…
private ArrayList<Pair<Short,Short>> dominoList = new…
List < AbstractMap.SimpleImmutableEntry < Short, Short > > dominoList = new ArrayList <>( 28 );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 0 , 0 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 0 , 1 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 1 , 1 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 0 , 2 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 1 , 2 ) );
List < Map.Entry < Short, Short > > dominoList = new ArrayList <>( 28 );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 0 , 0 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 0 , 1 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 1 , 1 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 0 , 2 ) );
dominoList.add( new AbstractMap.SimpleImmutableEntry( 1 , 2 ) );