【问题标题】:Ensure that a object is only in one list确保一个对象只在一个列表中
【发布时间】:2014-07-01 19:52:33
【问题描述】:

我遇到了一个非常基本的问题。

我需要确保一个对象只在一个列表中。 例如我有两个列表(伪代码):

Object person = new Object();
List waitingForCoffe = new List();
List waitingForTee = new List();

我如何确保该人在:

  1. 没有列表
  2. 列出 waitingForCoffe 或
  3. 列出 waitingForTee

但不能同时出现在展位列表中。 我是否需要确保在我的代码中或者已经存在某些东西? 设计模式?

【问题讨论】:

  • 检查两个列表的交集是否为空。
  • 您在这里使用哪种编程语言?您可以检查两个列表的交集,如果它为空,则表示他要么在其中一个列表中,要么都不在。
  • 这与您的实现无关,但我会创建一个带有一些字段的 Person 对象,用于存储等待咖啡/等待开球的状态。然后我会覆盖 hashcode / equals 方法,将这些对象放入 Set :)
  • @gipinani 我也在考虑亲自创建一个字段,无论是在“waitingForCoffe”还是“waitingForTee”中,我都可以保存信息。因此,我可以使用此信息从一个列表中删除对象,然后再将其添加到另一个列表中。但这对我来说似乎是一种黑客行为,尽管这种情况必须有一种设计模式。因为我有不止两个列表(有很多人),所以我担心交叉点会给我带来性能问题。
  • 你也可以使用 List contains() 方法。 Apache CollectionUtils 可能有更多关于你需要的东西。我不知道设计模式是否可以代表您的需求,但是您可以将所有逻辑隐藏在一个内部处理您的列表/集合的类中,并使用一些公共方法返回谁在哪里

标签: list reference reference-counting


【解决方案1】:

您可以让“Person”处理列表分配:

public class Person{

    private List currentList = null;

    public void addToList(List newList){

        if (newList == null  || newList == currentList) {
            return;
        }

        if (currentList != null){
            currentList.remove(this);
        }

        currentList = newList;
        newList.add(this);

    }

}

【讨论】:

    【解决方案2】:

    你可以使用一个集合

    static HashSet<String> set = new HashSet<String>();
    public static void add(ArrayList<String> array, String s)
    {
        if(!set.contains(s))
        {
            array.add(s);
        }
    }
    

    Set 只能有唯一的元素并且 contains() 是 O(1),所以你不需要担心运行时间。如果您想知道如何检查而不是添加,您可以遍历一个数组并将其所有元素添加到集合中。然后您可以遍历第二个数组并查看 Set 是否包含元素。如果是,则含义返回 true,然后您将重复

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      相关资源
      最近更新 更多