我想要(yourItems.contains(“Gin”))[显示所有饮品为杜松子酒] +(yourItems.contains(“Vodka”))[显示伏特加的所有饮料]然后将包含两者的饮料移至列表的顶部。
现在我的应用程序一旦选择了Gin和Vodka值就会崩溃
private List<Drinks> myDrinks = new ArrayList<Drinks>();
private ArrayList<String> yourItems;
...
private void populateDrinkList() {
if (yourItems.contains("Gin")){
myDrinks.add(new Drinks("a"));
myDrinks.add(new Drinks("b"));
myDrinks.add(new Drinks("c"));
myDrinks.add(new Drinks("d"));
myDrinks.add(new Drinks("e"));
if (yourItems.contains("Vodka")) {
Drinks toMoveUp = new Drinks("e");
while (myDrinks.indexOf(toMoveUp) != 0) {
int i = myDrinks.indexOf(toMoveUp);
Collections.swap(myDrinks, i, i-1 );
}
}
}
populateListView();
}
这是Drinks类
public class Drinks {
String name = null;
public Drinks(String name){
this.name= name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Log cat:https://docs.google.com/document/d/1WatONhY7mSsR6Wjs6haZnfNWPSeY0dpusvlbDxnHN5M/edit?usp=sharing
答案 0 :(得分:1)
好的,我已经明白你的代码有什么问题了
<{1>}类中的将此添加到您的代码中:
Drinks
在另一个中留下它:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Drinks other = (Drinks) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
答案 1 :(得分:0)
Drinks toMoveUp = new Drinks("e");
while (myDrinks.indexOf(toMoveUp) != 0)
在上面的代码中,你正在做的是你正在创建一个Drinks的新对象,并在myDrinks数组列表中查找它的索引。这将始终返回-1,因为这个新的Drinks对象(toMoveUp)不存在你的myDrinks数组列表。 所以, Collections.swap(myDrinks,i,i-1)将是Collections.swap(myDrinks,-1,-2); 这将导致索引超出绑定异常。 对此的解决方案是在Drinks类中添加一个标识符,它标识它是a,b,c,d或e。 然后通过myDrinks迭代以查找Drinks对象的索引,该对象使用我们创建的标识符与您的toMoveUp对象匹配。然后使用此索引进行交换。 希望这能帮助你。
示例代码 - //查找索引的方法
private int getIndex(Drinks drinks){
int i = 0;
for(Drinks obj : myDrinks){
if(obj.getName().equalsIgnoreCase(drinks.getName())){
return i;
}
i++;
}
return -1;
}
//将代码修改为
if (yourItems.contains("Vodka")) {
Drinks toMoveUp = new Drinks("e");
int index = getIndex(toMoveUp);
if(index != 0 && index !=-1) {
Collections.swap(myDrinks, 0, index );
}
}
答案 2 :(得分:0)
将您的模型更改为:
Map<String,List<Drink>>
将保存每个项目的项目。 然后你就可以这样做了:
if (yourItems.contains("Gin")){
myDrinks.addAll(0,map.get("Gin"));
}
在第一个参数中使用带有0的addAll会将添加的项目移动到顶部,这样可以节省交换部分。
答案 3 :(得分:0)
我会使用multimap和更好的Drink类。
Multimap之
private List<Drink> myDrinks = new ArrayList<Drink>();
// ...
HashMap<String, ArrayList<Drink>> allDrinks = getAllDrinks();
List<Drink> drinks = map.get(Drink.Type.Vodka);
myDrinks.addAll(0, drinks);
drinks = map.get(Drink.Type.Gin);
myDrinks.addAll(0, drinks);
饮酒课
添加一个包含inner enum
类型的Drink
。添加类型Drink.Type
的属性以保存饮品的类型。覆盖等于并添加饮料比较器
如果您想更改商品的顺序,请通过Drink的比较器对其进行排序,或者在对其进行排序时使用匿名比较器。
此解决方案有几个优点,仅举几例,您可以更快地检索,不再需要add(new(Drink(""))
,并且您可以通过简洁的方式订购商品。
注意:强>
我猜测myDrinks
列表中没有数以万计的饮料,因此对其进行排序不会产生任何性能问题。