Java 如何创建整数和字符串对的排序列表?
如何创建整数和字符串对的列表(或其他类型的容器),允许在这两个对中重复,并且可以按整数值排序 我需要用名称(字符串)和评分(整数)对填充容器,容器必须允许名称和评分中存在重复的值,并且我需要根据评分值对该列表进行排序 我尝试使用SortedMap,但不允许重复值:Java 如何创建整数和字符串对的排序列表?,java,Java,如何创建整数和字符串对的列表(或其他类型的容器),允许在这两个对中重复,并且可以按整数值排序 我需要用名称(字符串)和评分(整数)对填充容器,容器必须允许名称和评分中存在重复的值,并且我需要根据评分值对该列表进行排序 我尝试使用SortedMap,但不允许重复值: SortedMap<Integer,String> sm=new TreeMap<Integer, String>(); sm.put(23, "Peter"); sm.put(11, "Tony");
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
中
需要时使用集合对其进行排序。排序
如果您不需要允许具有相同名称和分数的重复项,您可以使用排序集
,只要您的比较顺序对分数和名称进行排序。听起来像是针对类型的作业
类
比较器的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”);