JAVA-List对象某个字段去重

时间:2022-01-05 14:56:42
List对象去重的算法
return new ArrayList<T>(new LinkedHashSet<T>(list))


我想要不是去除重复对象,而是去除对象中某个字段一样的对象。

举个例子:


public static void main(String[] args) {
class Temp{
private int a;
private String b;
private BigInteger cBigInteger;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public BigInteger getcBigInteger() {
return cBigInteger;
}
public void setcBigInteger(BigInteger cBigInteger) {
this.cBigInteger = cBigInteger;
}
}

Temp temp1 = new Temp();
temp1.setA(10);
temp1.setB("hehe");
temp1.setcBigInteger(new BigInteger("1111111111111111111111111"));

Temp temp2 = new Temp();
temp2.setA(10);
temp2.setB("hehe");
temp2.setcBigInteger(new BigInteger("1111111111111111111111111"));


Temp temp3 = new Temp();
temp3.setA(10);
temp3.setB("hehe3");
temp3.setcBigInteger(new BigInteger("1111111111111111111111111"));

Temp temp4 = new Temp();
temp4.setA(10);
temp4.setB("hehe4");
temp4.setcBigInteger(new BigInteger("1111111111111111111111111"));

List<Temp> list = new ArrayList<Temp>(); 
list.add(temp1);
list.add(temp2);
list.add(temp3);
list.add(temp4);
//如何去除字段b重复的对象呢?
}


我想去掉Temp对象中字段b重复的对象,上面的例子就是temp1和temp2。

除了使用双重for循环从第一个开始逐个和后面的遍历remove之外,有没有什么快速的方法呢?

9 个解决方案

#1


用hashcode 和 hashset 去重复

#2


对了   需要转换成 ArrayList 在用用hashcode 和 hashset 去重复

#3


hashcode不一样

引用 2 楼  的回复:
对了   需要转换成 ArrayList 在用用hashcode 和 hashset 去重复

#4


map呢 键值 无重复数据。 把您要去重的那个字段作为键

#5



//如何去除字段b重复的对象呢?
System.out.println(list.size());
HashMap<String, String> map = new HashMap<String, String>();
for(int i=0;i<list.size();i++){
if(map.get(list.get(i).getB())!=null){
list.remove(i);
}
else {
map.put(list.get(i).getB(), "OK");
}
}
System.out.println(list.size());


这样能去除后面重复的...对第一次出现的这个temp1就无能为例了...除非在循环一遍,把map里面key存在的对象处理一遍。。。

就这样吧....

引用 4 楼  的回复:
map呢 键值 无重复数据。 把您要去重的那个字段作为键

#6


估计我写的这个不是你想表达的...
引用 4 楼  的回复:
map呢 键值 无重复数据。 把您要去重的那个字段作为键

#7


你可以用HashSet来做,然后重写hashCode以及equals方法.实现一个自定义的比较方式.然后把这个List直接new成HashSet就可以了.

#8


sdd

#9


    Iterator<SourceBean> it = sourceList.iterator();
    while(it.hasNext()) {
      SourceBean sBean = (SourceBean)it.next();
      String sourceID = sBean.getId();
      if (!StringUtils.isEmpty(sourceID) ) {
        try{
          if ("4".equals(sourceID)) {
            if (youpeng_length <= 0) {
              it.remove();
            }
          }else if ("5".equals(sourceID)) {
            if (kanke_length <= 0) {
              it.remove();
            }
          }else if ("6".equals(sourceID)) {
            if (moreTV_length <= 0 ) {
              it.remove();
            }
          }        
}catch(Exception e) {
          e.printStackTrace();
        }
      }
    }

#1


用hashcode 和 hashset 去重复

#2


对了   需要转换成 ArrayList 在用用hashcode 和 hashset 去重复

#3


hashcode不一样

引用 2 楼  的回复:
对了   需要转换成 ArrayList 在用用hashcode 和 hashset 去重复

#4


map呢 键值 无重复数据。 把您要去重的那个字段作为键

#5



//如何去除字段b重复的对象呢?
System.out.println(list.size());
HashMap<String, String> map = new HashMap<String, String>();
for(int i=0;i<list.size();i++){
if(map.get(list.get(i).getB())!=null){
list.remove(i);
}
else {
map.put(list.get(i).getB(), "OK");
}
}
System.out.println(list.size());


这样能去除后面重复的...对第一次出现的这个temp1就无能为例了...除非在循环一遍,把map里面key存在的对象处理一遍。。。

就这样吧....

引用 4 楼  的回复:
map呢 键值 无重复数据。 把您要去重的那个字段作为键

#6


估计我写的这个不是你想表达的...
引用 4 楼  的回复:
map呢 键值 无重复数据。 把您要去重的那个字段作为键

#7


你可以用HashSet来做,然后重写hashCode以及equals方法.实现一个自定义的比较方式.然后把这个List直接new成HashSet就可以了.

#8


sdd

#9


    Iterator<SourceBean> it = sourceList.iterator();
    while(it.hasNext()) {
      SourceBean sBean = (SourceBean)it.next();
      String sourceID = sBean.getId();
      if (!StringUtils.isEmpty(sourceID) ) {
        try{
          if ("4".equals(sourceID)) {
            if (youpeng_length <= 0) {
              it.remove();
            }
          }else if ("5".equals(sourceID)) {
            if (kanke_length <= 0) {
              it.remove();
            }
          }else if ("6".equals(sourceID)) {
            if (moreTV_length <= 0 ) {
              it.remove();
            }
          }        
}catch(Exception e) {
          e.printStackTrace();
        }
      }
    }