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

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

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

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

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

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

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


当前回答

您可以编写一个通用的Pair< a, B>类,并在数组或列表中使用它。是的,你必须写一个类,但是你可以为所有类型重用同一个类,所以你只需要做一次。

其他回答

Apache common lang3有Pair类和本线程中提到的少数其他库,在Java中等价于c++ Pair<L,R> ?

匹配你最初问题要求的例子:

List<Pair<String, Integer>> myPairs = new ArrayList<Pair<String, Integer>>();
myPairs.add(Pair.of("val1", 11));
myPairs.add(Pair.of("val2", 17));

//...

for(Pair<String, Integer> pair : myPairs) {
  //following two lines are equivalent... whichever is easier for you...
  System.out.println(pair.getLeft() + ": " + pair.getRight());
  System.out.println(pair.getKey() + ": " + pair.getValue());
}

地图。条目

这些内置类也是一个选项。两者都实现了Map。输入接口。

AbstractMap。SimpleEntry AbstractMap。SimpleImmutableEntry

只需创建一个类

class Tuples 
{ 
    int x;
    int y;
} 

然后创建这个对象的元组列表

List<Tuples> list = new ArrayList<>();

因此,您还可以以相同的方式实现其他新的数据结构。

Spring在Data Utils包org.springframework.data.util中有一个Pair<S,T>类型

Pair<String,Integer> pair = Pair.of("Test", 123);
System.out.println(pair.getFirst());
System.out.println(pair.getSecond());

java14 +版本

您可以创建一个记录,实现equals、hashCode和toString的开箱即用。如果需要,还可以实现Comparable这样的接口。

record Pair<A, B>(A first, B second) {}

记录是不可变的。