使用多个if值优化Array结果

时间:2013-12-24 05:27:31

标签: java android arrays position

我想要(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

4 个答案:

答案 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类。

  1. 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);
    
  2. 饮酒课 添加一个包含inner enum类型的Drink。添加类型Drink.Type的属性以保存饮品的类型。覆盖等于并添加饮料比较器

  3. 如果您想更改商品的顺序,请通过Drink的比较器对其进行排序,或者在对其进行排序时使用匿名比较器。

    此解决方案有几个优点,仅举几例,您可以更快地检索,不再需要add(new(Drink("")),并且您可以通过简洁的方式订购商品。

    注意: 我猜测myDrinks列表中没有数以万计的饮料,因此对其进行排序不会产生任何性能问题。