我喜欢Java有一个映射,你可以在映射中定义每个条目的类型,例如<String, Integer>。

我正在寻找的是一种类型的集合,其中集合中的每个元素都是一对值。对中的每个值都可以有自己的类型(如上面的String和Integer示例),该类型在声明时定义。

该集合将保持其给定的顺序,不会将其中一个值视为唯一键(就像在映射中一样)。

本质上,我希望能够定义一个数组类型<String,Integer>或任何其他2种类型。

我意识到,我可以让一个类只有2个变量,但这似乎过于啰嗦。

我也意识到我可以使用一个2D数组,但因为我需要使用不同的类型,我必须使他们OBJECT数组,然后我必须一直强制转换。

我只需要在集合中存储对,所以每个条目只需要两个值。像这样的东西不走阶级路线就存在吗?谢谢!


当前回答

当谈到键/值对时,我想到的第一件事是属性类,你可以在其中保存和加载项到流/文件中。

其他回答

对于任何开发Android的人,你都可以使用Android .util. pair。:)

您需要的是某种对象的List。我个人不喜欢使用泛型的Pair类。他们有太多的缺点:

他们不太善于表达。除了类型参数外,它们不提供任何上下文信息。 它们阻止您使用基本类型 您不能对键或值应用任何约束(除了它们 当然是打字)。 它们迫使您在许多地方携带详细类型参数声明(尽管var和<>在某种程度上减轻了这一点)

我更喜欢使用特别类。虽然几年前,这是恼人的样板文件,但现在不再是这样了。

这里有两个替代选项,使得类的声明非常容易:

Java 14及以上版本:使用记录类

record TypedCount(String type, int count) {}

好了,就是这样。你可以免费获得toString()和equals()

Java 14之前:使用lombok的@Value注释

@Value
class TypedCount {
    String type;
    int count;
}

也是这样。Lombok自动将字段设置为私有final、构造函数、getter、toString()和equals()。

虽然这需要您将lombok作为依赖项添加,但这只是一个编译时依赖项,可以为您生成代码。lombok库在运行时不需要在类路径中。

AbstractMap。SimpleEntry

很容易你正在寻找这个:

java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();

你怎么填满它?

java.util.Map.Entry<String,Integer> pair1=new java.util.AbstractMap.SimpleEntry<>("Not Unique key1",1);
java.util.Map.Entry<String,Integer> pair2=new java.util.AbstractMap.SimpleEntry<>("Not Unique key2",2);
pairList.add(pair1);
pairList.add(pair2);

这可以简化为:

Entry<String,Integer> pair1=new SimpleEntry<>("Not Unique key1",1);
Entry<String,Integer> pair2=new SimpleEntry<>("Not Unique key2",2);
pairList.add(pair1);
pairList.add(pair2);

并且,在createEntry方法的帮助下,可以进一步减少冗长:

pairList.add(createEntry("Not Unique key1", 1));
pairList.add(createEntry("Not Unique key2", 2));

由于ArrayList不是final,所以可以子类化它来公开of方法(以及前面提到的createEntry方法),从而在语法上简洁:

TupleList<java.util.Map.Entry<String,Integer>> pair = new TupleList<>();
pair.of("Not Unique key1", 1);
pair.of("Not Unique key2", 2);

com.sun.tools.javac.util.Pair呢?

在其他答案上展开一个通用的不可变Pair应该有一个静态方法,以避免调用构造函数使你的代码变得混乱:

class Pair<L,R> {
      final L left;
      final R right;

      public Pair(L left, R right) {
        this.left = left;
        this.right = right;
      }

      static <L,R> Pair<L,R> of(L left, R right){
          return new Pair<L,R>(left, right);
      }
}

如果你将静态方法命名为“of”或“pairOf”,代码就会变得流畅,因为你可以写任何一个:

    list.add(Pair.of(x,y)); // my preference
    list.add(pairOf(x,y)); // use with import static x.y.Pair.pairOf

遗憾的是,核心Java库在这些事情上是如此的稀少,以至于你必须使用common -lang或其他第三方来做这些基本的事情。升级到scala的另一个原因…