到目前为止我已经
了public static void sort(Collection<Integer> l1){
Iterator<Integer> it = l1.iterator();
while(it.hasNext()){ //meant to be for(int i; i<l1.size(); i++)
if(l1[i] < l1[i+1]){
l1[i] = l1[i+1];
l1[i+1] = l1[i];
}
}
我在if语句中收到错误。
答案 0 :(得分:2)
您的代码中存在多个错误:
Collection
作为数组([i]
表示法)进行访问。您已经使用Iterator
正确遍历了它。在遍历时使用它来访问值。[i+1]
很可能会抛出ArrayIndexOutOfBoundsException
。l1
Collection
中的元素。i
变量,而没有定义,最重要的是,在循环迭代中保持其值。请注意,此变量不是必需的,因为您已经使用迭代器遍历Collection
。我建议
Collection
进行迭代,因为您已经在做了。请务必使用iterator.next()
实际使Iterator
前进并实际检索该值。add(item)
)。寻找它应该进入的位置(例如使用while
或for
循环迭代它)并使用List#add(int, E)
将新元素放入其位置,将以下元素移位到正确的。这样,这个新的List
将保证始终有序。只是给出一个起点/骨架,这里概述了它的外观:
public static Collection<Integer> sort(Collection<Integer> l1){
List<Integer> sortedList = new ArrayList<Integer>();
for (Iterator<Integer> it = l1.iterator(); it.hasNext(); ) {
Integer currentValue = it.next();
// Look into sortedList the position where currentValue should go into
int pos = 0;
for (int i=0;i<sortedList.size();i++) {
// Compare currentValue with sortedList.get(i)
// to know if i is the right position for currentValue.
// If it is, assign it to pos
}
sortedList.add(pos, currentValue);
}
return sortedList;
}
答案 1 :(得分:0)
在第一个例子中,迄今为止的评论是正确的。您不能将Collection用作数组。如果你宣布
public static void sort(List<Integer> l1)
然后可以使用toArray()
方法获取数组。
其次,陈述
l1[i] = l1[i+1];
l1[i+1] = l1[i];
不可能使你最终得到两个包含相同值的元素。
第三,我建议你阅读&#34; quicksort&#34;算法和实现......并不是那么困难。这是一个链接:http://www.vogella.com/tutorials/JavaAlgorithmsQuicksort/article.html