2010-12-04 66 views
12

如何创建整数和字符串对的列表(或其他类型的容器),允许两个对中的重复项并且可以按整数值排序?如何创建整数和字符串对的排序列表?

我需要用名称(字符串)和评分(整数)对填充容器,容器必须允许名称和评分中的重复值,并且我需要按评分值对此列表进行排序。

我试图用一个SortedMap,但不允许重复值:

SortedMap<Integer,String> sm=new TreeMap<Integer, String>(); 

sm.put(23, "Peter"); 
sm.put(11, "Tony"); 
sm.put(110, "Claire"); 
sm.put(13, "ferca"); 
sm.put(55, "Julian"); 
sm.put(13, "Pedro"); 

在这个例子中,ferca和佩德罗有相同的得分值,这是我需要允许,但SortedMap的覆盖“ ferca“与”Pedro“。

什么是最好的容器类型来做到这一点?

+1

如果你允许重复的名字,你会如何区分哪两个名字? – 2010-12-04 13:01:07

回答

11

既然你想要订购你的系列,我建议你使用ListCollections.sort。如果你决定去这个方法,你仍然有两种选择:

  • 创建一个自定义Comparator,可以作为参数传递给sort,或
  • 让辅助Score类实现Comparable<Score>

以下是后一种方法的示例和ideone demo

import java.util.*; 

class Score implements Comparable<Score> { 
    int score; 
    String name; 

    public Score(int score, String name) { 
     this.score = score; 
     this.name = name; 
    } 

    @Override 
    public int compareTo(Score o) { 
     return score < o.score ? -1 : score > o.score ? 1 : 0; 
    } 
} 

public class Test { 

    public static void main(String[] args){ 
     List<Score> scores = new ArrayList<Score>(); 

     scores.add(new Score(23, "Peter")); 
     scores.add(new Score(11, "Tony")); 
     scores.add(new Score(110, "Claire")); 
     scores.add(new Score(13, "ferca")); 
     scores.add(new Score(55, "Julian")); 
     scores.add(new Score(13, "Pedro")); 

     Collections.sort(scores); 
    } 
} 
0

如果你想有一个列表,使用列表...

最好的选择很可能会创建自己的类型来封装字符串和整数,添加自己的比较,并把它们放在一个ArrayList<T>

当您需要与Collections.sort排序。

如果你不需要让它们具有相同的名称得分重复,你可以使用一个SortedSet代替,只要你的比较顺序排序双方比分名。

6
  1. 创建class围住这两个领域
  2. 创建一个自定义Comparator是比较基于int值两个对象。
  3. 创建的一个list对象
  4. 通obj的 comparator这里

    class MyEntity{ 
        int val; 
        String name; 
    } 
    
    
    List<MyEntity> list = new ArrayList<MyEntity>(); 
    list.add(new MyEntity(1,"a")); 
    list.add(new MyEntity(4,"z")); 
    list.add(new MyEntity(2,"x")); 
    Collections.sort(list,new MyComparator()); 
    
    
    class MyComparator implements Comparator<MyEntity>{ 
        public int compare(MyEntity ob1, MyEntity ob2){ 
        return ob1.getVal() - ob2.getVal() ; 
        } 
    } 
    

  • Collection.sort();注:这只是模型显示的基本思想

  • +1

    我建议你不要实现原始的Comparator接口,而应该使用`Comparator `。这是更安全的类型,你不需要输入参数。 – aioobe 2010-12-04 13:39:39

    0

    After您创建一个持有类型,替代结构是PriorityQueue来持有这些项目。这与Collections.sort()不同,因为这些项目是按顺序插入的,高或低的值都会升至最高。

    你必须做的唯一事情就是编写一个比较器来传递到实例化的PriorityQueue,所以它知道要根据整数值对项目进行排序。

    这种方法和Collections.sort()都可以通过不同的方式来实现相同的结果。它们也运行在O(N log N)时间。

    相关问题