迭代包含ArrayList的ArrayList

时间:2013-12-09 04:16:34

标签: java recursion arraylist

我正在处理套袋问题。我获得了一个项目列表(整数)和包含maxSize的行李。我试图找到最少量的袋子以适应所有物品。我需要以递归方法执行此操作。

我正在存储bag对象(这是整数的ArrayList,有一些辅助方法可以检查大小+ int是否大于bag的maxSize)。然后我将所有这些包存储在ArrayList对象中。我遇到的问题是我似乎在为每个包添加每个项目。以下是我认为问题所在的方法。一旦我发现我可以将物品添加到'i'的包中,我想不出退出的方法。在这一点上,我需要得到一个新的项目,并尝试将它包装在第一个袋子,如果它不适合然后尝试第二个,第三个等。

baggedList = ArrayList :::: recList =我试图收集的整体列表

我觉得我过度复杂了。如果您有任何更好的建议,请告诉我们。

    public boolean bagging (ArrayList<Integer> recList){

    boolean keepBagging = true;
    System.out.println("right before the recursive method");
    System.out.println("the reclist before while loop" + recList.toString());

    while (!recList.isEmpty() && keepBagging){
        int item = recList.remove(recList.size() -1);
        for (int i= 0; i < baggedList.size(); i ++){
            System.out.println("i = " + i + " Item = " + item);
            if (tryToBag(item, i)){ //boolean method
                addItem (item, i); //adds the item
                bagging (recList); //recursive call
            }
            else {
                System.out.println("FAILED" + keepBagging);
                keepBagging = false;
            }
        }
    }
    return keepBagging;
}

调用Bag方法的CanBag方法

    private boolean tryToBag(int item, int i) {

    boolean canBag = false;
    Bag currentBag = baggedList.get(i);
    ArrayList<Integer> list = currentBag.getList();

    if (currentBag.canBag(item)){
        canBag = true;
    }
    return canBag;
}

canBag方法

    public boolean canBag(int size){

    if (size + Bag.sum() <= maxBagSize){
        return true;
    }
    else return false;
}

的toString

    public String toString(){
    int counter = 0;
    String ret = "";
    for (int i = 0; i < baggedList.size(); i++){
        Bag tryThisBag = baggedList.get(i);
        ret += "bag " + counter + tryThisBag.getList().toString();
        counter++;
    }
    return ret;
}

addItem方法

    private void addItem(int item, int i) {
    Bag currentBag = baggedList.remove(i); //removing list
    ArrayList<Integer> list = currentBag.getList(); // new list
    list.add(item); //adding item
    System.out.println ("List here at bag" + i + " : " + list.toString());
    currentBag.setList(list); // sets the arrayList back to the bag object
    baggedList.add(i, currentBag); //sets the bag at the index in the collection of bags

}

3 个答案:

答案 0 :(得分:0)

public boolean bagging (ArrayList<Integer> recList){

boolean keepBagging = true;
System.out.println("right before the recursive method");
System.out.println("the reclist before while loop" + recList.toString());

while (!recList.isEmpty() && keepBagging) {
    int item = recList.remove(recList.size() -1);
    for (int i= 0; i < baggedList.size(); i ++){
        System.out.println("i = " + i + " Item = " + item);
        if (tryToBag(item, i)){ //boolean method
            addItem (item, i); //adds the item
            break;
        }
        else {
            System.out.println("FAILED" + keepBagging);
            keepBagging = false;
        }
    }
}
return keepBagging;
}

我只是在您的代码中添加了一个中断调用,很难理解您的目标。你不应该用这个来解决问题。如果您可以尝试包装并添加一个项目,然后中断然后删除下一个项目并循环更多。这是你想要的吗?或者在成功的情况下,它应该继续下一次迭代吗?

答案 1 :(得分:0)

对于重新列表中的每个项目,尝试在行李中找到一个插槽,如果发现中断了for循环并移动到重新列表中的下一个项目

while (!recList.isEmpty()) {
int item = recList.remove(recList.size() -1);
for (int i= 0; i < baggedList.size(); i ++){
    System.out.println("i = " + i + " Item = " + item);
    if (tryToBag(item, i)){ //boolean method
        addItem (item, i); //adds the item
    }
  break;
  }
}

答案 2 :(得分:0)

我废弃了这个版本并开始了一个采用不同方法的新版本。