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

时间:2014-10-29 09:45:08

标签: 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];
    }

}

我在if语句中收到错误。

2 个答案:

答案 0 :(得分:2)

您的代码中存在多个错误:

  1. 无法将Collection作为数组([i]表示法)进行访问。您已经使用Iterator正确遍历了它。在遍历时使用它来访问值。
  2. 在该循环中以定义结束条件的方式访问[i+1]很可能会抛出ArrayIndexOutOfBoundsException
  3. 您提到需要返回一个新列表,但您似乎正在尝试重新排列同一个l1 Collection中的元素。
  4. 不知道您的代码中是否已经忽略了它,但是您没有定义i变量,而没有定义,最重要的是,在循环迭代中保持其值。请注意,此变量不是必需的,因为您已经使用迭代器遍历Collection
  5. 我建议

    1. 对您原来的Collection进行迭代,因为您已经在做了。请务必使用iterator.next()实际使Iterator前进并实际检索该值。
    2. 将每个值插入新列表,但不只是在最后(使用add(item))。寻找它应该进入的位置(例如使用whilefor循环迭代它)并使用List#add(int, E)将新元素放入其位置,将以下元素移位到正确的。这样,这个新的List将保证始终有序。
    3. 阅读关于集合和循环的优秀java教程,例如来自Oracle的Java教程The Collection InterfaceLanguage Basics: The while statement可能是一个很好的起点。
    4. 只是给出一个起点/骨架,这里概述了它的外观:

      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