Java中的排序列表

Java中的排序列表,java,list,Java,List,我需要用java对列表进行如下排序: 列表包含如下对象的集合: List list1 = {obj1, obj2,obj3,.....}; 我需要有“最低值”和“应避免重复名称”的最终列表 例: 排序后,我需要如下列表: List list1 = {[Nellai,5],[Gujarath,10],[Delhi,20]}; 我的名单上有2个德里(30,20)。但我只需要一个票价最低的德里(20) 如何在java中实现这一点 Gnaniyar Zubair我会分两个阶段来做 首先,使用自定义比

我需要用java对列表进行如下排序:

列表包含如下对象的集合:

List list1 = {obj1, obj2,obj3,.....};
我需要有“最低值”和“应避免重复名称”的最终列表

例:

排序后,我需要如下列表:

List list1 = {[Nellai,5],[Gujarath,10],[Delhi,20]};
我的名单上有2个德里(30,20)。但我只需要一个票价最低的德里(20)

如何在java中实现这一点


Gnaniyar Zubair

我会分两个阶段来做

首先,使用自定义比较器对列表进行排序


其次,遍历列表,对于重复条目(如果正确使用比较器,现在将彼此相邻),删除具有较高值的条目。

与@Visage answer几乎相同,但顺序不同:

public class NameFare {
    private String name;
    private int fare;
    public String getName() {
        return name;
    }
    public int getFare() {
        return fare;
    }
    @Override public void equals(Object o) {
        if (o == this) {
            return true;
        } else if (o != null) {
            if (getName() != null) {
                return getName().equals(o.getName());
            } else {
                return o.getName() == null;
            }
        }
        return false;
    }
}
....
public Collection<NameFare> sortAndMerge(Collection<NameFare> toSort) {
    ArrayList<NameFare> sorted = new ArrayList<NameFare>(toSort.size());
    for (NameFare nf : toSort) {
        int idx = sorted.getIndexOf(nf); 
        if (idx != -1) {
            NameFare old = sorted.get(idx);
            if (nf.getFare() < old.getFare()) {
                sorted.remove(idx);
                sorted.add(nf);
            }
        }
    }
    Collections.sort(sorted, new Comparator<NameFare>() {
        public int compare(NameFare o1, NameFare o2) {
            if (o1 == o2) {
                return 0;
            } else {
                if (o1.getName() != null) {
                    return o1.getName().compareTo(o2.getName()); 
                } else if (o2.getName() != null) {
                    return o2.getName().compareTo(o1.getName()); 
                } else {
                    return 0;
                }
            }
        }
    });
}
public class name票价{
私有字符串名称;
私人国际机票;
公共字符串getName(){
返回名称;
}
公共交通费{
往返车费;
}
@覆盖公共void等于(对象o){
如果(o==这个){
返回true;
}如果(o!=null),则为else{
如果(getName()!=null){
返回getName().equals(o.getName());
}否则{
返回o.getName()==null;
}
}
返回false;
}
}
....
公共集合排序合并(集合排序){
ArrayList sorted=新的ArrayList(toSort.size());
用于(名称:toSort){
int idx=sorted.getIndexOf(nf);
如果(idx!=-1){
nameforeold=sorted.get(idx);
如果(nf.getFare()
如果顺序不重要,解决方法是使用
地图[String,Integer]
,每次找到新市镇时添加一个条目,每次存储值小于存储值时更新该值,然后将所有对压缩到一个列表中。

我会使用如下ArrayList:

ArrayList<Name> listOne = new ArrayList<Name>();
listOne.add(new Name("Nellai", 10);
listOne.add(new Name("Gujarath", 10);
listOne.add(new Name("Delhi", 30);
listOne.add(new Name("Nellai", 5);
listOne.add(new Name("Delhi", 20);

Collection.sort(listOne);
ArrayList listOne=new ArrayList();
添加(新名称(“Nellai”,10);
增列(新名称(“古吉拉特”,10);
增列(新名称(“德里”,30);
添加(新名称(“Nellai”,5);
添加(新名称(“德里”,20);
Collection.sort(listOne);
然后创建Name类

    class name implements Comparable
{
private String name;
private int number;

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

public String getName()
{
        return this.name;
}
public int getNumber()
{
        return this.number;
} 
public int compareTo(Object otherName) //  must be defined if we are implementing //Comparable interface
{
 if(otherName instanceif Name)
{
throw new ClassCastException("Not valid Name object"):
}
Name tempName = (Name)otherName;
// eliminate the duplicates when you sort 
if(this.getNumber() >tempName.getNumber())
  {
     return 1;
  }else if (this.getNumber() < tempName.getNumber()){
     return -1;
  }else{
     return 0;
  }
}

}
类名实现了可比较的
{
私有字符串名称;
私有整数;
公共名称(字符串名称、整数)
{
this.name=name;
这个。数字=数字;
}
公共字符串getName()
{
返回此.name;
}
public int getNumber()
{
返回此.number;
} 
public int compareTo(Object otherName)//如果要实现//可比接口,则必须定义
{
如果(其他名称实例如果名称)
{
抛出新的ClassCastException(“无效的名称对象”):
}
Name tempName=(Name)otherName;
//排序时消除重复项
if(this.getNumber()>tempName.getNumber())
{
返回1;
}else if(this.getNumber()
我没有编译代码,它是在这里编辑的,所以你应该修复代码。还要弄清楚如何消除重复,只打印最低的一个


你也需要努力。

如果你想避免重复,也许像TreeSet这样的类比List更好。

你必须保持元素的顺序吗?(例如:结果中Nellai必须在古吉拉特之前?)不,它是动态添加的。顺序可能会改变正如您所指出的,您没有删除重复项,并且在Name类中实现compare方法在一般情况下并不是处理此问题的最佳方法。1我认为给他答案和他只复制/粘贴是不好的。他也需要工作。2您需要重写abstract方法compareTo在Name类中。1.我同意,这就是为什么最好给出关于算法的线索,而不是代码片段。2.问题是compareTo方法必须与equals一致。因此,以这种方式实现Comparable接口意味着,如果2
Name
s具有相同的数字,则它们是相等的…awkward。你说得对,我试着使用你的想法,它非常优雅,我同意你的观点。但我的目的是给他一个想法,他应该在这个想法上下功夫。当你有一点代码和很多想法的时候,这很容易。
    class name implements Comparable
{
private String name;
private int number;

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

public String getName()
{
        return this.name;
}
public int getNumber()
{
        return this.number;
} 
public int compareTo(Object otherName) //  must be defined if we are implementing //Comparable interface
{
 if(otherName instanceif Name)
{
throw new ClassCastException("Not valid Name object"):
}
Name tempName = (Name)otherName;
// eliminate the duplicates when you sort 
if(this.getNumber() >tempName.getNumber())
  {
     return 1;
  }else if (this.getNumber() < tempName.getNumber()){
     return -1;
  }else{
     return 0;
  }
}

}