我喜欢Java有一个映射,你可以在映射中定义每个条目的类型,例如<String, Integer>。
我正在寻找的是一种类型的集合,其中集合中的每个元素都是一对值。对中的每个值都可以有自己的类型(如上面的String和Integer示例),该类型在声明时定义。
该集合将保持其给定的顺序,不会将其中一个值视为唯一键(就像在映射中一样)。
本质上,我希望能够定义一个数组类型<String,Integer>或任何其他2种类型。
我意识到,我可以让一个类只有2个变量,但这似乎过于啰嗦。
我也意识到我可以使用一个2D数组,但因为我需要使用不同的类型,我必须使他们OBJECT数组,然后我必须一直强制转换。
我只需要在集合中存储对,所以每个条目只需要两个值。像这样的东西不走阶级路线就存在吗?谢谢!
“Apache Commons Lang 3”Pair类和相关子类怎么样?
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
...
@SuppressWarnings("unchecked")
Pair<String, Integer>[] arr = new ImmutablePair[]{
ImmutablePair.of("A", 1),
ImmutablePair.of("B", 2)};
// both access the 'left' part
String key = arr[0].getKey();
String left = arr[0].getLeft();
// both access the 'right' part
Integer value = arr[0].getValue();
Integer right = arr[0].getRight();
ImmutablePair是一个特定的子类,它不允许修改pair中的值,但是还有其他具有不同语义的实现。这些是Maven的坐标,如果你需要的话。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
我的意思是,尽管Java中没有Pair类,但有一些非常相似的东西:Map。条目
地图。输入文档
这就是HashMap或任何Map存储的内容(简化了一点)。
您可以创建一个Map实例,将值存储在其中并获取条目集。你将得到一个Set<Map。条目<K,V>>实际上就是你想要的。
So:
public static void main(String []args)
{
HashMap<String, Integer> values = new HashMap<String,Integer>();
values.put("A", 235);//your custom data, the types may be different
//more data insertions....
Set<Map.Entry<String,Integer>> list = values.entrySet();//your list
//do as you may with it
}
在project Reactor (io. projecreactor: Reactor -core)中,有对n-Tuples的高级支持:
Tuple2<String, Integer> t = Tuples.of("string", 1)
在那里你可以得到t.getT1(), t.getT2(),…特别是Stream或Flux,你甚至可以映射元组元素:
Stream<Tuple2<String, Integer>> s;
s.map(t -> t.mapT2(i -> i + 2));
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());
}