Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java成对列表_Java_List_Class - Fatal编程技术网

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泛型和集合
IMHO和IMHO都是更好地理解和编码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类:

版本意味着关键部分和价值部分都不能替换为其他对象。存储为键或值的对象本身可能是可变的(具有可以更改的状态,例如使用setter方法)

例如:

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 ) );