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