Java 为什么在使用[]运算符时会出现编译错误?

Java 为什么在使用[]运算符时会出现编译错误?,java,Java,到目前为止我有 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]

到目前为止我有

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语句中遇到错误。

您的代码中有几个错误:

集合不能作为数组[i]符号访问。您已经使用迭代器适当地遍历了它。在遍历时使用它访问值。 以定义结束条件的方式访问该循环中的[i+1]很可能会引发ArrayIndexOutOfBoundsException。 您提到需要返回一个新列表,但您似乎试图重新排列同一个l1集合中的元素。 不知道它是否已在代码中使用,但您引用的是一个i变量,而没有定义,而且最重要的是,在循环迭代中保持它的值。请注意,这个变量不是必需的,因为您已经在使用迭代器遍历集合。 我建议

像您已经做的那样迭代原始集合。记住使用iterator.next来实际执行迭代器并实际检索值。 将每个值插入一个新列表,但不要仅在additem的末尾插入。寻找它应该进入的位置,例如,用while或for循环迭代它,并使用它将新元素放到它的位置,将以下元素向右移动一个位置。这样,新列表将保证始终有序。 例如,阅读有关集合和循环的优秀java教程,Oracle的java教程可能是一个很好的起点。 为了给出一个起点/框架,下面是它的大致外观:

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;
}

首先,迄今为止的评论是正确的。不能将集合当作数组使用。如果你申报

public static void sort(List<Integer> l1)
不可能工作,最终两个元素都包含相同的值


第三,我建议您仔细阅读快速排序算法并实现。。。这并不难。这里有一个链接供您使用:

这是因为Java只允许[]运算符用于内置数组,如new Integer[14]。此外,l1是一个集合,它不同于未排序的列表,因此对其排序没有意义。我建议先学习一些Java的基本教程。方括号语法不适用于Java中的集合。此外,并非每个集合都适合您的任务-您需要完全有序的集合。使用list和access元素,而不是square breckets。了解Array和ArrayList的区别它们在java中是两种不同的东西
   l1[i] = l1[i+1];
   l1[i+1] = l1[i];