我有这个代码用于排序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循环重写代码?
答案 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;
}