将不同类型的元素添加到arraylist
Posted
技术标签:
【中文标题】将不同类型的元素添加到arraylist【英文标题】:Adding elements of different type to arraylist 【发布时间】:2022-01-22 17:48:33 【问题描述】:所以我有一个数组列表,看起来像这样ArrayList<Card> player1Hand = Player.Player1(seed);
它包含[KH, 9L, 7L, 8L, KE]
每个组合代表一张卡片。
和一个数组split[]
包含[KH]
现在我尝试了这个:
if (player1Hand.contains(split[2])) //code
现在 if 语句没有被执行,因为 split[] 包含 String 类型的对象,而 arrayList 包含 Card
类型的对象。有没有简单的方法来解决这个问题?
【问题讨论】:
您可以使用Map<String,Card>
代替ArrayList<Card>
并使用map.containsKey(split[2])
另外,Card 有 String 构造函数吗?你可以做player1hand.contains(new Card(split[2]))
。对于这种方法,您可能需要重载equals
【参考方案1】:
您应该为您的 Card 类创建一个命名构造函数(来自 Effective Java J.Bloch)并像这样覆盖 equals
和 hashCode
:
class Card
private String valueAsString;
/*your code here*/
public static Card of(String valueAsString)
Card card = /*create your card here*/
card.valueAsString = valueAsString;
return card;
@Override
public boolean equals(Object other)
/*another part of equals*/
return Objects.equals(valueAsString, other.valueAsString);
@Override
public int hashCode()
return Objects.hash(valueAsString);
使用该命名构造函数,您可以执行以下操作:
if (player1Hand.contains(Card.of(split[2])))
/*do something*/
解释:只要ArrayList
使用equals
方法来比较数组中的元素,您就需要正确定义它。此外,命名构造函数可帮助您根据 split[2]
的值创建占位符对象。通过这两个步骤,您将能够使用contains
,它会按照您的意愿工作。为什么还要覆盖hashCode
?您应该这样做,因为有一条非正式规则,您应该始终像一对一样覆盖 equals
和 hashCode
,因为它们必须使用相同的字段集。
【讨论】:
以上是关于将不同类型的元素添加到arraylist的主要内容,如果未能解决你的问题,请参考以下文章
JSX 元素类型错误:将类型添加到从 .map 函数返回的对象