我有一个实现Recipe
的对象Comparable<Recipe>
:
public int compareTo(Recipe otherRecipe) {
return this.inputRecipeName.compareTo(otherRecipe.inputRecipeName);
}
我已经这样做了,所以我可以按以下方法按字母顺序对List
进行排序:
public static Collection<Recipe> getRecipes(){
List<Recipe> recipes = new ArrayList<Recipe>(RECIPE_MAP.values());
Collections.sort(recipes);
return recipes;
}
但是现在,在另一种方法中,我们将其称为getRecipesSort()
,我想对数据进行排序,但是数字,比较包含其ID的变量。更糟糕的是,ID字段的类型为String
。
如何使用Collections.sort()在Java中执行排序?
答案 0 :(得分:59)
使用此方法Collections.sort(List,Comparator)。实施Comparator并将其传递给Collections.sort().
class RecipeCompare implements Comparator<Recipe> {
@Override
public int compare(Recipe o1, Recipe o2) {
// write comparison logic here like below , it's just a sample
return o1.getID().compareTo(o2.getID());
}
}
然后使用Comparator
作为
Collections.sort(recipes,new RecipeCompare());
答案 1 :(得分:22)
使用Lambda表达式可以使 NINCOMPOOP 给出的答案更简单:
Collections.sort(recipes, (Recipe r1, Recipe r2) ->
r1.getID().compareTo(r2.getID()));
在Java 8之后还引入了Comparator接口中的比较器构造方法。使用这些,可以进一步将其减少为 1 :
recipes.sort(comparingInt(Recipe::getId));
1 Bloch,J。 Effective Java (3 rd Edition)。 2018.项目42,p。 194。
答案 2 :(得分:5)
创建一个比较器,在其构造函数中接受比较模式,并根据您的要求为不同的场景传递不同的模式
public class RecipeComparator implements Comparator<Recipe> {
public static final int COMPARE_BY_ID = 0;
public static final int COMPARE_BY_NAME = 1;
private int compare_mode = COMPARE_BY_NAME;
public RecipeComparator() {
}
public RecipeComparator(int compare_mode) {
this.compare_mode = compare_mode;
}
@Override
public int compare(Recipe o1, Recipe o2) {
switch (compare_mode) {
case COMPARE_BY_ID:
return o1.getId().compareTo(o2.getId());
default:
return o1.getInputRecipeName().compareTo(o2.getInputRecipeName());
}
}
}
实际上,对于数字,您需要单独处理它们,请查看下面的
public static void main(String[] args) {
String string1 = "1";
String string2 = "2";
String string11 = "11";
System.out.println(string1.compareTo(string2));
System.out.println(string2.compareTo(string11));// expected -1 returns 1
// to compare numbers you actually need to do something like this
int number2 = Integer.valueOf(string1);
int number11 = Integer.valueOf(string11);
int compareTo = number2 > number11 ? 1 : (number2 < number11 ? -1 : 0) ;
System.out.println(compareTo);// prints -1
}
答案 3 :(得分:3)
如果要对自然顺序以外的其他内容进行排序,请使用接受Comparator
的方法。
答案 4 :(得分:0)
按升序对未排序的hashmap进行排序。
foreach (var touch in touches)
{
sp.PhysicsBody.ApplyImpulse(new CGVector(10, 50));
if (c.curLevelY < Frame.Height / 6 * 4)
{
c.curLevelY += Frame.Height / 6 * 1;
}
else
{
c.curLevelY = Frame.Height / 6 * 1;
}
}