如何在以下代码中用增强的for循环替换for循环?

时间:2014-12-05 15:39:10

标签: java for-loop

我有这个代码用于排序arraylist

    ArrayList<Worker> workersSorted= sort(workers);
    System.out.println(workersSorted.toString());
}

public static ArrayList<Worker> sort(ArrayList<Worker> _workers) throws CloneNotSupportedException {
    Worker temp;
    for (int i = 0; i < _workers.size() - 1; i++) {
        if ((_workers.get(i)).compareTo(_workers.get(i+1)) == -1){
            temp = (Worker) _workers.get(i).clone();
            _workers.set(i, _workers.get(i+1));
            _workers.set(i+1, temp);    
        }
    }
    return _workers;
}

如何使用增强型for循环重写代码?

3 个答案:

答案 0 :(得分:1)

虽然这可能不是您正在寻找的答案,但我的意见是,即使您可以重写此方法以使用增强的for循环,您也不应该

您当前的方法在其意图中相当清楚,并且增强for循环将无法在特定索引处清楚地访问Worker个实例。如果您尝试在迭代期间进行更改,则可能会遇到ConcurrentModificationException的问题。最重要的是,增强的for循环可能会略微(你可能会毫无意义地争论)慢。

基本上,增强的for循环不太适合您的要求。

答案 1 :(得分:0)

我认为您正在寻找的是:

for(Worker w : _workers)

您将使用w代替_workers.get(i)_workers.get(_workers.indexOf(w) + 1)代替_workers.get(i+1)。正如您所看到的,它将非常难看,因为您必须使用indexOf才能访问列表中的下一个元素,并检查w是否是列表的最后一个元素(因为{{ 1}}将在这种情况下抛出错误)。您还需要考虑另一件事 - 您的ArrayList是否包含重复项?如果是,则_workers.get(_workers.indexOf(w) + 1)将始终返回它找到的第一个值。

我建议你在这种情况下坚持使用普通的indexOf

答案 2 :(得分:0)

非常糟糕,但应该有效。我将索引移回了,所以现在i+1是当前的Worker对象w,然后我必须将最后一个工作者保存在previous中。

ArrayList<Worker> workersSorted= sort(workers);
    System.out.println(workersSorted.toString());}

    public static ArrayList<Worker> sort(ArrayList<Worker> _workers) throws        CloneNotSupportedException{

        Worker temp;
        Worker previous;
        int prevIdx=-1;
        ArrayList<Worker> wNew=new ArrayList<Worker>;

        for (Worker w: _workers){

            if (previous !=null && (previous).compareTo(w)==-1){
                temp=(Worker) w.clone();
                wNew.set(prevIdx, w);
                wNew.add( temp);    
            }
         previous=w;
         prevIdx++;
        }
        return _workers;
    }