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

Java 如何创建整数和字符串对的排序列表?,java,Java,如何创建整数和字符串对的列表(或其他类型的容器),允许在这两个对中重复,并且可以按整数值排序 我需要用名称(字符串)和评分(整数)对填充容器,容器必须允许名称和评分中存在重复的值,并且我需要根据评分值对该列表进行排序 我尝试使用SortedMap,但不允许重复值: SortedMap<Integer,String> sm=new TreeMap<Integer, String>(); sm.put(23, "Peter"); sm.put(11, "Tony");

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

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

我尝试使用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");  
SortedMap sm=newtreemap();
sm.put(23,“彼得”);
sm.put(11,“托尼”);
sm.put(110,“克莱尔”);
sm.put(13,“费卡”);
sm.put(55,“朱利安”);
sm.put(13,“佩德罗”);
在本例中,ferca和Pedro具有相同的评分值,这是我需要允许的,但SortedMap将“ferca”覆盖为“Pedro”


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

如果需要列表,请使用列表

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

需要时使用
集合对其进行排序。排序

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

听起来像是针对类型的作业

  • 创建一个包含这两个字段的
  • 创建基于int值比较两个对象的自定义
  • 创建一个对象的
  • 在此传递
    比较器的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() ;
      }
    }
    
    类MyEntity{
    int-val;
    字符串名;
    }
    列表=新的ArrayList();
    增加(新实体(1,“a”);
    添加(新的MyEntity(4,“z”);
    添加(新的MyEntity(2,“x”);
    Collections.sort(list,new MyComparator());
    类MyComparator实现比较器{
    公共整数比较(MyEntity ob1、MyEntity ob2){
    返回ob1.getVal()-ob2.getVal();
    }
    }
    
  • 注意:这只是一个展示基本思想的模型


    既然您希望订购您的收藏,我建议您使用
    列表
    和。如果您决定采用这种方法,您仍然有两种选择:

    • 创建一个自定义的
      比较器
      ,该比较器可以作为参数传递给或
    • 让辅助
      得分
      类实现
      可比
    以下是后一种方法的示例和示例:

    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);
        }
    }
    
    import java.util.*;
    班级成绩实行可比{
    智力得分;
    字符串名;
    公共分数(整数分数、字符串名称){
    这个分数=分数;
    this.name=名称;
    }
    @凌驾
    公共整数比较(分数o){
    返回分数o.score-1:0;
    }
    }
    公开课考试{
    公共静态void main(字符串[]args){
    列表分数=新的ArrayList();
    分数。添加(新分数(23,“彼得”);
    分数。添加(新分数(11,“托尼”);
    分数。添加(新分数(110,“Claire”);
    分数。添加(新分数(13,“ferca”);
    分数。添加(新分数(55,“朱利安”);
    分数。增加(新分数(13,“佩德罗”);
    集合。排序(分数);
    }
    }
    
    创建保留类型后,另一种结构是保留项目。这与
    Collections.sort()
    不同,因为项目是按顺序插入的,高值或低值都会上升到顶部

    您唯一需要做的就是编写一个比较器,在实例化时传递到PriorityQueue,这样它就知道如何根据整数值对项目进行排序


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

    如果允许重复名称,您将如何区分哪两个名称?我建议您不要实现原始比较器接口,而是使用
    Comparator
    。它更为类型安全,并且不需要强制转换参数。错误:MyEntity类中的构造函数MyEntity不能应用于给定的类型;增加(新实体(1,“a”);