jsf*_*cha 42 java sorting collections spring-mvc
我有一个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中执行排序?
NIN*_*OOP 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());
    }
}
然后使用Comparatoras
Collections.sort(recipes,new RecipeCompare());
小智 23
使用Lambda表达式可以使NINCOMPOOP给出的答案更简单:
Collections.sort(recipes, (Recipe r1, Recipe r2) ->
r1.getID().compareTo(r2.getID()));
Java 8之后还介绍了Comparator接口中的比较器构造方法.使用这些,可以进一步将其减少到1:
recipes.sort(comparingInt(Recipe::getId));
1布洛赫,J. 有效的Java(3 次版).2018.项目42,p.194.
创建一个比较器,在其构造函数中接受比较模式,并根据您的要求为不同的场景传递不同的模式
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
}
| 归档时间: | 
 | 
| 查看次数: | 193885 次 | 
| 最近记录: |