【问题标题】:How to remove duplicates from list<object>如何从 list<object> 中删除重复项
【发布时间】:2015-05-23 03:20:36
【问题描述】:

我在 java 中有一个名为 foo 的对象。 我可以做foo.getDate();,这会给我一个项目的日期。 但现在我有一个list&lt;foo&gt;,我想为每个项目获取一个日期。 所以如果我遍历我的列表,我会看到这个输出:

3-1-2015
3-1-2015
5-1-2015
8-1-2015
8-1-2015

但我想看看:

3-1-2015
5-1-2015
8-1-2015

所以我希望仅将具有唯一日期的第一项添加到列表中。 我怎样才能在 Java 中做到这一点?

提前致谢!

【问题讨论】:

  • 你试过什么?有很多方法可以做到这一点,例如扩展 ArrayList 并使用一些逻辑覆盖 add 方法以检查该项目是否已存在。另一种方法可能是在 add 方法之前添加一些逻辑,以检查它是否已经存在并决定是否添加。
  • 听起来你想要的是一个集合,而不是一个列表。

标签: java arrays list object arraylist


【解决方案1】:

只是为了补充@Pshemo 的答案,对 Java 8 做同样的事情很简单:

public class RemoveDuplicates {

    public static void main(String[] args) {

        // Initialize some dates
        long now = System.currentTimeMillis();
        Date d1 = new Date(now);
        Date d2 = new Date(now - 10_000_000_000L);
        Date d3 = new Date(now - 100_000_000_000L);

        // Initialize some Foos with the dates    
        List<Foo> list = new ArrayList<>(Arrays.asList(
            new Foo(d3), new Foo(d3), new Foo(d2), 
            new Foo(d1), new Foo(d1)));

        Set<Date> uniqueDates = new HashSet<>();

        // Filter foos whose date is already in the set    
        List<Foo> distinct = list.stream().filter(
            f -> uniqueDates.add(f.getDate())).
            collect(Collectors.toList());

        System.out.println(distinct); // [Foo [date=17/01/12], 
                                      //  Foo [date=24/11/14], 
                                      //  Foo [date=19/03/15]]

    }

    static class Foo {

        private static DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT);

        private final Date date;

        Date getDate() {
            return this.date;
        }

        Foo(Date date) {
            this.date = date;
        }

        @Override
        public String toString() {
            return "Foo [date=" + formatter.format(this.date) + "]";
        }
    }
}

原理完全相同:如果日期已经在集合中,则将Foo从流中过滤掉。

【讨论】:

    【解决方案2】:

    你可能应该为此使用Set

    【讨论】:

      【解决方案3】:

      创建将存储唯一日期的集合。如果您的 foo 实例中的日期尚未添加到集合中,则将此实例添加到包含具有唯一日期的 foo 对象的列表中。

      List<Foo> list = new ArrayList<>();
      //fill list with your foo instances
      
      
      Set<Date> uniqueDates = new HashSet<>();
      List<Foo> resultList = new ArrayList<>();
      
      for (Foo f : list){
          if (uniqueDates.add(f.getDate())){//if I was able to add date to set
              //it means that instance with this date is seen first time
              //so I can add it to result list
              resultList.add(f);
          }
      }
      

      【讨论】:

      • 谢谢!这正是我所需要的!谢谢!
      【解决方案4】:

      可能最简单的方法是使用地图(例如HashMap)...使用 Date 作为键,然后将所有 Foo 对象放入其中。然后每次一个键已经存在时,该值将被覆盖,并且每个 Date 最终只有一个 Foo 对象。如果您需要一个列表(例如用于排序),您可以执行new ArrayList&lt;Foo&gt;( myMap.values() ); 之类的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-24
        • 2011-04-19
        • 1970-01-01
        • 1970-01-01
        • 2012-09-28
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多