将不同类型的元素添加到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)并像这样覆盖 equalshashCode

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?您应该这样做,因为有一条非正式规则,您应该始终像一对一样覆盖 equalshashCode,因为它们必须使用相同的字段集。

【讨论】:

以上是关于将不同类型的元素添加到arraylist的主要内容,如果未能解决你的问题,请参考以下文章

JSX 元素类型错误:将类型添加到从 .map 函数返回的对象

如何将前缀类型添加到重复父节点并使用 XSLT 选择每个元素的所有元素?

第一章

python循环里的列表怎样添加到循环外

在循环中单击另一个元素时将事件侦听器添加到元素

以设定的时间间隔将 jQuery 添加到数组中的元素