如何创建整数和字符串对的排序列表?
如何创建整数和字符串对的列表(或其他类型的容器),允许两个对中的重复项并且可以按整数值排序?
我需要使用名称(字符串)和评分(整数)对填充容器,容器必须允许名称和评分中的重复值,并且我需要按评分值对此列表进行排序。
我尝试使用SortedMap但不允许重复值:
SortedMap sm=new TreeMap(); 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”。
这样做的最佳容器类型是什么?
由于您希望订购您的collections,我建议您使用List
和Collections.sort
。 如果您决定采用这种方法,您仍有两种选择:
- 创建一个自定义
Comparator
,可以作为参数传递给sort
,或 - 让辅助
Score
类实现Comparable
以下是后一种方法的示例和ideone演示 :
import java.util.*; class Score implements Comparable { 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 scores = new ArrayList (); 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); } }
- 创建一个包含这两个字段的类
- 创建一个自定义
Comparator
,根据int值比较两个对象。 - 创建该对象的
list
-
Collection.sort();
在这里传递comparator
objclass MyEntity{ int val; String name; } List
list = new ArrayList (); 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 { public int compare(MyEntity ob1, MyEntity ob2){ return ob1.getVal() - ob2.getVal() ; } }
注意:这只是展示基本概念的模型
- 这是工作ideone演示
听起来像是Guava的 Multimap类型的工作,特别是TreeMultimap 。
如果你想要一个清单,请使用清单……
最好的选择可能是创建自己的类型来封装字符串和整数,添加自己的比较,并将它们放在ArrayList
。
需要时使用Collections.sort
对其进行排序。
如果您不需要允许具有相同名称和分数的重复项,则可以使用SortedSet
,只要您的比较顺序对分数和名称进行排序即可。
创建保留类型后,替代结构是PriorityQueue来保存项目。 这与Collections.sort()
不同,因为项目按顺序插入,高值或低值上升到顶部。
你唯一要做的就是编写一个比较器,以便在instanciation上传递给PriorityQueue,因此它知道根据整数值对项进行排序。
这个方法和Collections.sort()
以不同的方式提供相同的结果。 它们也在O(N log N)时间内运行。