2010-12-01 64 views
2

我需要排序在Java中,如下列表:排序清單中的Java

列表中包含這樣的對象的集合,

List list1 = {obj1, obj2,obj3,.....}; 

我需要擁有「最低值」和「最終名單名字的重複應避免「。

例:

List list1 = {[Nellai,10],[Gujarath,10],[Delhi,30],[Nellai,5],[Gujarath,15],[Delhi,20]} 

排序後,我需要的清單是這樣的:

List list1 = {[Nellai,5],[Gujarath,10],[Delhi,20]}; 

我有2德里(30,20)在我的名單。但我只需要一個票價最低的德里(20)。

如何在java中做到這一點?

Gnaniyar Zubair

+0

你必須保持你的元素的順序? (即:Nellai在結果之前是否應該在古傑拉特之前?) – Nicolas 2010-12-01 12:13:53

+0

不,它是動態添加的。順序可能會改變 – 2010-12-01 12:19:12

回答

1

幾乎一樣@Visage的答案,但順序不同:

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; 
       } 
      } 
     } 
    }); 
} 
1

我會在兩個階段做到這一點。

首先使用自定義比較器對列表進行排序。其次,遍歷該列表,並且對於重複的條目(現在它們將彼此相鄰,如果您正確地使用比較器),則刪除具有較高值的​​條目。

4

如果順序並不重要,一個解決方案是使用一個Map[String, Integer],每次添加一個條目,你找到一個新的鎮,每次存儲的值小於存儲的值時更新該值,然後將所有對壓縮到列表中。

0

我會用一個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); 

然後創建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; 
    } 
} 

} 

我沒有編譯的代碼,它在此編輯的,所以你應該修復代碼。並找出如何消除重複並只打印最低的一個。

你也需要汗水。

1

如果你想避免重複,可能像TreeSet這樣的類將是比List更好的選擇。