Java 如何对Arraylist进行排序,使其集合按值列表排序

Java 如何对Arraylist进行排序,使其集合按值列表排序,java,arraylist,java-stream,Java,Arraylist,Java Stream,我有一个Arraylist,其中包含配方,每个配方都包含一个配料列表。答案显示在Android应用程序的UI列表中,用户希望根据他们最喜欢的成分对列表进行排序 例如,这是他们最喜欢的配料列表 1 - Cheese 2 - Potato 3 - Tuna 4 - Chicken 因此,配方清单应首先显示所有含有奶酪的成分,然后是土豆等。 如何使用javastream()将其存档 以下是我的模型课程目前的情况 public class Recipe { String[] ingredie

我有一个Arraylist,其中包含配方,每个配方都包含一个配料列表。答案显示在Android应用程序的UI列表中,用户希望根据他们最喜欢的成分对列表进行排序

例如,这是他们最喜欢的配料列表

1 - Cheese
2 - Potato
3 - Tuna
4 - Chicken
因此,配方清单应首先显示所有含有奶酪的成分,然后是土豆等。 如何使用java
stream()
将其存档

以下是我的模型课程目前的情况

public class Recipe {

    String[] ingredients;
    private String description;
    private String title;


    public String[] getIngredients() {
        return ingredients;
    }

    public void setIngredients(String[] ingredients) {
        this.ingredients = ingredients;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}


您可以创建comparatorPotato和comparatorCheese,然后根据它们进行排序

  static class Recipie {
        List<String> list;

        public Recipie(List<String> list) {
            this.list = list;
        }

        @Override
        public String toString() {
            return list.toString();
        }
    }

    public static void main(String[] args) {
               List<Recipie> recipies = new ArrayList<>();
        recipies.add(new Recipie(Arrays.asList("Cheese", "Potato", "Onions")));
        recipies.add(new Recipie(Arrays.asList("Tuna", "Potato", "Chicken")));
        recipies.add(new Recipie(Arrays.asList("Potato", "Cheese")));
        recipies.add(new Recipie(Arrays.asList("Chicken")));
        recipies.add(new Recipie(Arrays.asList("Chicken", "Potato")));
        recipies.add(new Recipie(Arrays.asList("Cheese", "Tomato")));

        List<Recipie> result = recipies.stream().sorted(Comparator.comparing(r -> !r.list.contains("Potato")))
                .sorted(Comparator.comparing(r -> !r.list.contains("Cheese"))).collect(Collectors.toList());

        System.out.println(result);
    }

Recipe类未使用Recipe类,因此可以修改模型以使用Component类

public class Recipe {
    List<Ingredient> ingredients;
    ...
}
您可以使用结果比较器对列表进行排序:

List<Recipe> recipeList = // ... get the recipeList
if (favoritesComparator.isPresent()) {
    recipeList.sort(favoritesComparator.get());
}
列表recipeList=/。。。找到接受者
if(favoritesComparator.isPresent()){
recipeList.sort(favoritesComparator.get());
}

为什么要使用Java 8流?只需使用
Collections.sort(list)。请显示一些代码。我的意思是你也可以使用
流#排序
来获得排序流。可能会有帮助,但请注意性能方面的问题。@M.S.刚刚添加了一些您应该检查逻辑条件的内容<代码>第一&!第二| |第一&!第二个
是多余的,因为两个备选方案是相同的。此外,
first&&second | | first&&!第二个
包含
第二个
!在两个备选方案中,第二个
,而有共同的
第一个&&…
,因此结果就是
第一个
,而不考虑
第二个
的内容。您应该在结果中注意到,包含
“Cheese”
“Potato”
的列表并不在开头。不要手动实现此类比较器,只需使用比较器。比较(r->!r.list.contains(“土豆”))
。或者只使用比较器。比较(r->!r.getComponents().contains(配料))
public class Recipe {
    List<Ingredient> ingredients;
    ...
}
public class ContainsIngredientComparator implements Comparator<Recipe> {

    private Ingredient ingredient;

    public ContainsIngredientComparator(Ingredient ingredient) {
        this.ingredient = ingredient;
    }   

    @Override
    public int compare(Recipe r1, Recipe r2) {
        if (r1.getIngredients().contains(ingredient)) {
            if (r2.getIngredients().contains(ingredient)) {
                return 0;
            } else {
                return -1;
            }
        } else if (r2.getIngredients().contains(ingredient)) {
            return 1;
        } else {
            return 0;
        }
    }
}
Optional<ContainsIngredientComparator> favoritesComparator = favorites.stream()
        .map(ContainsIngredientComparator::new)
        .reduce((c1, c2) -> (ContainsIngredientComparator) c1.thenComparing(c2));
List<Recipe> recipeList = // ... get the recipeList
if (favoritesComparator.isPresent()) {
    recipeList.sort(favoritesComparator.get());
}