如何根据属性比较从列表中删除项目?

时间:2014-02-26 06:57:53

标签: java

我有一个对象列表“Artical”,它有2个属性articalid和articalVersion 如下图所示。

enter public class Artical{
public int articalid;
public double articalVersion;
//with getter and setters
}

现在有列表有以下结果

articalid=1098  articalVersion=1.0
articalid=1098  articalVersion=1.1
articalid=1078  articalVersion=1.0
articalid=1078  articalVersion=1.1
articalid=1065  articalVersion=1.0
articalid=1043  articalVersion=1.0

现在我想制作仅包含版本号较大的对象的列表(和articalid不得重复),如

articalid=1098  articalVersion=1.1
articalid=1078  articalVersion=1.1
articalid=1065  articalVersion=1.0
articalid=1043  articalVersion=1.0

2 个答案:

答案 0 :(得分:2)

首先对列表进行排序

Collections.sort(articleList, new ArticalComparatorSort());

使用以下比较器:

class ArticalComparatorSort implements Comparator<Artical>
{

    @Override
    public int compare(Artical a1, Artical a2)
    {
        if(a1.getArticalid() < a2.getArticalid()){
            return -1;
        }
        else if(a1.getArticalid() > a2.getArticalid()){
            return  1;
        }
        else{ // When both id are equals
            return Double.compare(a2.getArticalVersion(), a1.getArticalVersion());
        }
    }

}

这将排序为:

[1043 : 1.0
, 1065 : 1.0
, 1078 : 1.1
, 1078 : 1.0
, 1098 : 1.1
, 1098 : 1.0

然后使用TreeSet删除重复项

Set<Artical> mySet = new TreeSet<Artical>(new ArticalComparatorSet());

对于TreeSet,请使用以下comperator:

class ArticalComparatorSet implements Comparator<Artical>
{

    @Override
    public int compare(Artical a1, Artical a2)
    {
        if(a1.getArticalid() < a2.getArticalid()){
            return -1;
        }
        else if(a1.getArticalid() > a2.getArticalid()){
            return  1;
        }
        else{ 
            return 0;
        }
    }

}

这将删除重复项:

[1043 : 1.0
, 1065 : 1.0
, 1078 : 1.1
, 1098 : 1.1 

因此,您只需要添加这三行代码来删除重复项:

Collections.sort(articleList, new ArticalComparatorSort());

Set<Artical> mySet = new TreeSet<Artical>(new ArticalComparatorSet());

mySet.addAll(articleList);
  

并且只实现上述比较器

答案 1 :(得分:0)

在迭代中这样做

         Map<Integer,Artical> outPuts = new HashMap<Integer,Artical>();
 for(Artical artical1 : articals ){
     for(Artical artical2 : articals ){
             if(artical1.getarticalid() == artical2.getarticalid()){
             int retval = Double.compare(artical1.getarticalVersion(), artical2.getarticalVersion());
             if(retval > 0) {
                 if(outPuts.containsKey(artical1.getarticalid())){
                     outPuts.remove(artical1.getarticalid());
                     outPuts.add(artical1.getarticalid(),artical1);
                 }else{
                     outPuts.add(artical1.getarticalid(),artical1);
                 }
                 }
             else{
                 if(outPuts.containsKey(artical1.getarticalid())){
                     outPuts.remove(artical1.getarticalid());
                     outPuts.add(artical1.getarticalid(),artical1);
                 }else{
                     outPuts.add(artical1.getarticalid(),artical1);
                 }
                 }
         }
     }
 }