我喜欢Java有一个映射,你可以在映射中定义每个条目的类型,例如<String, Integer>。
我正在寻找的是一种类型的集合,其中集合中的每个元素都是一对值。对中的每个值都可以有自己的类型(如上面的String和Integer示例),该类型在声明时定义。
该集合将保持其给定的顺序,不会将其中一个值视为唯一键(就像在映射中一样)。
本质上,我希望能够定义一个数组类型<String,Integer>或任何其他2种类型。
我意识到,我可以让一个类只有2个变量,但这似乎过于啰嗦。
我也意识到我可以使用一个2D数组,但因为我需要使用不同的类型,我必须使他们OBJECT数组,然后我必须一直强制转换。
我只需要在集合中存储对,所以每个条目只需要两个值。像这样的东西不走阶级路线就存在吗?谢谢!
您需要的是某种对象的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库在运行时不需要在类路径中。
您可以重用现有的Pair或来自“天知道有多少库已经提供了这样的类”的任何此类类。如果你不想从Hans Brende对这个问题的回答中得到任何东西,那么我不认为有任何理由不使用2D数组或对象数组列表/数组列表作为对/元组。你提到了不使用Array的原因:
我也意识到我可以使用一个2D数组,但因为我需要使用不同的类型,我必须使他们OBJECT数组,然后我必须一直强制转换。
即使您使用了来自Accepted Answer的Pair类,您仍然必须强制转换键和值对象。因为你想要存储所有类型的对象。换句话说,List<Pair> pairs与List<Pair<?扩展Object>>对,依次与Object[][2]或List<Object[]>或List<List<Object>>没有区别。因为如果你写下面的代码:
List<Pair> pairs = new ArrayList<>();
// logic for populating pairs into list goes here
// then after sometime you need an element
Pair p = pairs.get(whateverIndex);
Object key = p.getKey(); // We don't know type of key, right?
Object value = p.getValue(); // We don't know the exact type here as well
// All sorts of type guessing statemntes go here
GuessedTypeOfKey finallyMyKey = (GuessedTypeOfKey) key;
GuessedTypeOfValue finallyMyValue = (GuessedTypeOfValue) value;
你仍然需要进行类型转换。所以我找不到任何其他理由不使用2d对象数组或对象数组列表/数组列表作为对/元组。下面是使用List和数组的代码
List<Object[]> simplePairs = new ArrayList<>();
// Add values to pairs
simplePairs.add(new Object[]{1,"One"});
simplePairs.add(new Object[]{"Another Key of Different Type","Value"});
simplePairs.add(new Object[]{"Another Key of Different Type",new AnotherType("Another Value Type")});
// get values
Object[] pair = simplePairs.get(whateverIndex);
Object key = pair[0];
Object value = pair[1];