【问题标题】:Remove duplicates from two hash set从两个哈希集中删除重复项
【发布时间】:2013-03-05 04:20:39
【问题描述】:

在我的情况下,我有两个哈希集,一个包含朋友的姓名和号码,另一个包含 包含从 db 检索并存储到集合中的现有朋友的姓名和编号 如何比较和删除存储到新集合中的拖车集和交集数据中的重复项?
我需要在谷歌中的代码我在比较器中看到比较器他们只使用了一组但在我的情况下我正在检查两组对不起我的英语不好

【问题讨论】:

  • 你试过任何代码吗?
  • 显示一些java。哈希映射/集的声明。样本数据。预期结果。
  • 朋友 f1=new Friend("Karthik","111");朋友 f2=new Friend("Mani","222");朋友 f3=new Friend("Karthik","111");朋友 f4=new Friend("Mani","Manik");朋友 f5=new Friend("Karthik","111"); Set f=new HashSet(); f.add(f1); f.add(f2); f.add(f3); f.add(f4); f.add(f5); Set set2=new HashSet(); set2.add(new Friend("Karthik", "111")); set2.add(new Friend("Raju", "3333"));
  • 你需要实现equals和hashcode——对吗?
  • correct.in equals 方法如何比较两组?

标签: java set hashset


【解决方案1】:

假设我们有 set1 和 set2 我们可以执行以下操作

    Set set3 = new HashSet(set1);
    set3.retainAll(set2);    
    set1.removeAll(set3);
    set2.removeAll(set3);

在你的情况下是

public class Friend {
    String name;
    String number;

    public Friend(String name, String number) {
        this.name = name;
        this.number = number;
    }

    @Override
    public int hashCode() {
        return name.hashCode() + 31 * number.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Friend)) {
            return false;
        }
        Friend other = (Friend)obj;
        return other.number.equals(number) && other.name.equals(name);
    }

    @Override
    public String toString() {
        return name + "-" + number;
    }
}

public static void main(String[] args) throws Exception {
    Set<Friend> set1 = new HashSet<Friend>();
    set1.add(new Friend("Karthik", "111"));
    set1.add(new Friend("Mani", "222"));
    set1.add(new Friend("Karthik", "111"));
    set1.add(new Friend("Mani", "444"));
    set1.add(new Friend("Karthik", "111"));

    Set<Friend> set2 = new HashSet<Friend>();
    set2.add(new Friend("Karthik", "111"));
    set2.add(new Friend("Raju", "3333"));

    Set<Friend> set3 = new HashSet<Friend>(set1);
    set3.retainAll(set2);
    set1.removeAll(set3);
    set2.removeAll(set3);

    System.out.println(set1);
    System.out.println(set2);
}

输出

[Mani-444, Mani-222]
[Raju-3333]

【讨论】:

  • 嗨,我的输入是 Set set1=new HashSet(); set1.add(new Friend("Karthik","111")); set1.add(new Friend("Mani","222")); set1.add(new Friend("Karthik","111")); set1.add(new Friend("Mani","444")); set1.add(new Friend("Karthik","111")); Set set2=new HashSet(); set2.add(new Friend("Karthik", "111")); set2.add(new Friend("Raju", "3333")); Set set3 = new HashSet(set1)set3.retainAll(set2); set1.removeAll(set3);set2.removeAll(set3);如果我打印 set3 它显示空集。如果我打印 set2 它显示 set2 数据。哪一组数据不重复?
  • 感谢回复。它工作正常。但我还需要检查 id 的号码
  • private String name;private String number;//getter setter方法@Override public int hashCode() {return name.hashCode()+number.hashCode();}@Override public boolean equals(Object obj){if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Friend other = (Friend) obj;if (name == null) {if (other.name != null)return false; } else if (!name.equals(other.name))return false;if (number == null) {if (other.number != null)return false;}else if(!number.equals(other.number) )返回假;返回真;}
  • 你是对的。但如果我改变 set2 isset2.add(new Friend("Karthikeyan", "111"));set2.add(new Friend("Raju", “3333”));它给出的输出是 Karthikeyan-111,Raju-3333。但我只需要 raju-3333,因为 111 号码已经在 set1 中。
  • 好吧,那你应该改变 hashCode 和 equals 只关心数字
【解决方案2】:

试试这个

 Friend f1=new Friend("Karthik",111); 
 Friend f2=new Friend("Mani",222); 
 Friend f3=new Friend("Karthik",111); 
 Friend f4=new Friend("Mani",222); 
 Friend f5=new Friend("Karthik",111); 

 Set<Friend> set1=new HashSet<Friend>(); 
 set1.add(f1); 
 set1.add(f2); 
 set1.add(f3); 
 set1.add(f4); 
 set1.add(f5); 

 Set<Friend> set2=new HashSet<Friend>(); 
 set2.add(new Friend("Karthik", 111)); 
 set2.add(new Friend("Raju", 333));  
 set1.addAll(set2); //Adding all the objects from set2 to set1

 Set<Friend> set3=new HashSet<Friend>(); // creating a new Set object
/////////// Logic for removing duplicates ///////////////////////
 Set mine=new HashSet();
 for (Iterator<Friend> it = set1.iterator(); it.hasNext();) {
 Friend s = it.next();
    if(mine.add(s.getName()))
    set3.add(new Friend(s.getName(),s.getId()));
 }
 /////////// Now set3 contains non-duplicates objects ///////////
 for (Iterator<Friend> it = set3.iterator(); it.hasNext();) {
 Friend s = it.next();
     System.out.println("Name:"+s.getName()+"   Id:"+s.getId());
 }

【讨论】:

    【解决方案3】:

    我对您的要求的理解是从两个集合中删除重复项并将相交数据存储到新集合中。

    我的方法是覆盖 Friend 类中的 hashCode() 和 equals() 方法。 然后我用这样的retainAll() 方法创建具有交集数据的commonFriends。 修改 - 获取两个集合中的剩余数据

    Set<Friend> commonFriend = new HashSet<Friend>();
    commonFriend.addAll(f);
    commonFriend.retainAll(set2);
    // Find remaining data
    set2.removeAll(commonFriend);
    f.removeAll(commonFriend);
    

    详细编码是

    package examA;
    
    import java.io.File;
    import java.util.HashSet;
    import java.util.Set;
    
    public class Test1 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            Friend f1 = new Friend("Karthik", "111");
            Friend f2 = new Friend("Mani", "222");
            Friend f3 = new Friend("Karthik", "111");
            Friend f4 = new Friend("Mani", "Manik");
            Friend f5 = new Friend("Karthik", "111");
    
            Set<Friend> f = new HashSet<Friend>();
            f.add(f1);
            f.add(f2);
            f.add(f3);
            f.add(f4);
            f.add(f5);
    
            Set<Friend> set2 = new HashSet<Friend>();
            set2.add(new Friend("Karthik", "111"));
            set2.add(new Friend("Raju", "3333"));
            set2.add(new Friend("Karthikeyan", "111"));
            set2.add(new Friend("Raju", "3333"));
    
            System.out.println("Set 1 size" + f.size());
            System.out.println("Set 2 size" + set2.size());
    
            Set<Friend> commonFriend = new HashSet<Friend>();
            commonFriend.addAll(f);
            commonFriend.retainAll(set2);
            System.out.println("Common size" + commonFriend.size());
    
            f.removeAll(commonFriend);
            System.out.println("Remaining Data in f" + f.size());
    
            set2.removeAll(commonFriend);
            System.out.println("Remaining Data in set2" + set2.size());
            for (Friend friend : commonFriend) {
                System.out.println(friend);
            }
        }
    }
    
    class Friend {
        private String name;
        private String number;
    
        public Friend(String name, String number) {
            this.name = name;
            this.number = number;
        }
    
        @Override
        public String toString() {
            return "Friend [name=" + name + ", number=" + number + "]";
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((number == null) ? 0 : number.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Friend other = (Friend) obj;
            if (number == null) {
                if (other.number != null)
                    return false;
            } else if (!number.equals(other.number))
                return false;
            return true;
        }
    }
    

    【讨论】:

    • 感谢您的回复。它工作正常。但它只显示两个集合中的公共数据。但我希望 set2 中的剩余数据除了删除数据后的公共数据。
    • 我修改了我的代码以获取两个集合中的剩余数据。希望你能帮忙!!
    • 感谢您的回复。它工作正常。但如果我更改 set2 isset2.add(new Friend("Karthikeyan", "111"));set2.添加(新朋友(“拉朱”,“3333”));它给出的输出set2是Karthikeyan-111,Raju-3333。但我只需要raju-3333,因为111号已经在set1中。但我需要set2的输出只是Raju-3333
    • 我明白你的意思。您只想检查数字,而不是名称。如果是这样,请修改 hashCode 和 equal 方法以确保它只使用数字。我修改了我的详细代码。
    【解决方案4】:

    你可以使用

    addAll()

    设置方法。这会将元素从一组复制到另一组。而且由于 Sets 不允许重复,所以会小心的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 2015-04-25
      • 2020-04-18
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多