如何创建整数和字符串对的排序列表?

时间:2010-12-04 12:54:24

标签: java

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

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

我尝试使用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和Pedro具有相同的得分值,这是我需要允许的,但是SortedMap用“Pedro”覆盖“ferca”。

执行此操作的最佳容器类型是什么?

5 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:6)

  1. 创建一个包含这两个字段的class
  2. 创建一个自定义Comparator,根据int值比较两个对象。
  3. 创建list个对象
  4. Collection.sort();传递comparator此处的obj

    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() ;
      }
    }
    
  5. 注意:这只是展示基本理念的模型

答案 2 :(得分:2)

听起来像是Guava's Multimap种类的作业,特别是TreeMultimap

答案 3 :(得分:0)

如果您想要列表,请使用列表...

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

需要Collections.sort时对其进行排序。

如果您不需要允许具有相同名称​​和分数的重复项,则可以使用SortedSet代替,只要您的比较顺序对两个分数进行排序名称。

答案 4 :(得分:0)

创建保留类型后,另一个结构PriorityQueue用于保存项目。这与Collections.sort()不同,因为项目按顺序插入,其中高值或低值都会上升到顶部。

你唯一需要做的就是编写一个Comparator,在instanciation上传递给PriorityQueue,因此它知道根据整数值对项进行排序。

这种方法和Collections.sort()都以不同的方式提供相同的结果。它们也在O(N log N)时间内运行。