【问题标题】:Sorting through ArrayLists, Code issue通过 ArrayLists 排序,代码问题
【发布时间】:2012-06-15 13:11:46
【问题描述】:
 // 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 数组中,冲洗并重复,直到它遍历整个数组。

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

谢谢

【问题讨论】:

  • 您不使用Collections.sort的任何特殊原因?这是作业吗?
  • 我推荐使用for(int i:ontarioBankInfoInt)。这样你就可以在循环中使用i 而不是ontarioBankInfoInt.get(i)

标签: java list sorting


【解决方案1】:

您没有重新初始化 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 元素。

【讨论】:

    【解决方案2】:

    看这部分:

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

    第一次进入内部时,它会将pastMincurrentMin 设置为相同的值。在那之后,任何值怎么可能既小于小于currentMin大于大于pastMin

    不清楚你想要达到什么目标,但这就是为什么你只会进入中间部分一次。

    【讨论】:

      【解决方案3】:

      这是获取最低整数列表的一种快速而粗暴的方法,每年一个。

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

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

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

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

      1. 将 ontarioBankInfoInt 复制到 Set 中(从而删除重复项)。
      2. 回到列表中。
      3. 对列表进行排序。
      4. 获取所需年数的子列表。

      但是说真的,请使用其他答案中描述的循环... :)

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-27
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多