通过ArrayLists排序,代码问题

时间:2012-06-15 13:11:46

标签: java list sorting

 // Find smallest year
 int pastMin=0;
 int currentMin=ontarioBankInfoInt.get(0);
 int currentMinIndex=0;
 int reps=(ontarioBankInfoInt.size()-1)/3;

 for(int x=0; x<=reps; x++){
   for (int i=0; i<ontarioBankInfoInt.size()-1; i++){
        if (ontarioBankInfoInt.get(i)<currentMin){
            if (ontarioBankInfoInt.get(i)>pastMin){
                currentMin = ontarioBankInfoInt.get(i);
                currentMinIndex = i;     
                pastMin = currentMin;
            }//If End
        }//If End       
   }//For End

   //Add other information  
   yearArray.add(currentMin);
 }//For End

注意:reps是需要查找的年数。 这段代码的目的是搜索一个最小年份的arrayList然后将它添加到“yearArray”然后它找到下一个最小的add将它添加到say阵列,冲洗并重复直到它在整个数组中工作。

我的问题是它总是在同一年返回,我不知道为什么有任何帮助?

由于

3 个答案:

答案 0 :(得分:2)

您没有重新初始化currentMincurrentMinIndex,因此这些值会达到最小值,然后就不会重新分配。

您需要在循环内重新初始化它们。

for(int x=0; x<=reps; x++){

   int currentMin = Integer.MAX_VALUE;  // Do this here.
   //int currentMinIndex = -1;  // This is never used??

   for (int i=0; i < ontarioBankInfoInt.size() - 1; i++) {
        int value = ontarioBankInfoInt.get(i);
        if (value < currentMin && value > pastMin) {
            currentMin = value;
            //currentMinIndex = i;     
        }
   }

   pastMin = currentMin; // I also think you want this here.
   yearArray.add(currentMin);
}

或者您可以对列表进行排序并获取第一个reps元素。

答案 1 :(得分:0)

看看这部分:

if (ontarioBankInfoInt.get(i)<currentMin){
    if (ontarioBankInfoInt.get(i)>pastMin){
        currentMin = ontarioBankInfoInt.get(i);
        currentMinIndex = i;     
        pastMin = currentMin;
    }
}

第一次进入内部时,它会将pastMincurrentMin设置为相同的值。在此之后,任何值都

你想要实现的目标并不是很清楚,但这就是为什么你只会进入中间部分。

答案 2 :(得分:0)

这是一种快速而残酷的方法,可以获得每年最低一次的最低排名列表。

Collections.sort(ontarioBankInfoInt);
List<Integer> yearArray = new ArrayList<Integer>(ontarioBankInfoInt.subList(0, reps));

您可能希望在排序之前将ontarioBankInfoInt的内容复制到新数组中(如果您想保留原始订单)。

这当然假设ontarioBankInfoInt中没有重复值。 {3}年{ 1,3,2,1,2 }会给您{ 1,1,2 }而不是{ 1,2,3 }

如果您不想要重复值,并且您不想使用循环(并且性能不是问题),那么您可以:

  1. 将ontarioBankInfoInt复制到一个Set中(从而删除重复项)。
  2. 回到列表中。
  3. 对列表进行排序。
  4. 获取您需要的年数的子列表。
  5. 但严重的是,使用其他答案中描述的循环......:)