【问题标题】:How to find the minimum value in an ArrayList, along with the index number? (Java)如何在 ArrayList 中找到最小值以及索引号? (爪哇)
【发布时间】:2013-04-06 09:40:44
【问题描述】:

我需要在Java中获取我的arraylist中最小值的索引值。我的arraylist 包含几个浮点数,我正在想办法获得最小浮点数的索引号,这样我就可以在代码的其他地方使用该索引号。我是初学者,所以请不要讨厌我。谢谢!

【问题讨论】:

  • 我认为选择的解决方案不完整。它仍然缺少一些东西!如果最小值出现多次怎么办?毕竟是一个清单。所以我认为如果最小值的索引应该返回一个列表

标签: java arraylist


【解决方案1】:

您可以使用Collections.minList.indexOf

int minIndex = list.indexOf(Collections.min(list));

如果你只想遍历列表一次(上面可能会遍历两次):

public static <T extends Comparable<T>> int findMinIndex(final List<T> xs) {
    int minIndex;
    if (xs.isEmpty()) {
        minIndex = -1;
    } else {
        final ListIterator<T> itr = xs.listIterator();
        T min = itr.next(); // first element as the current minimum
        minIndex = itr.previousIndex();
        while (itr.hasNext()) {
            final T curr = itr.next();
            if (curr.compareTo(min) < 0) {
                min = curr;
                minIndex = itr.previousIndex();
            }
        }
    }
    return minIndex;
}

【讨论】:

  • 您的解决方案仍然缺少一些东西!如果最小值出现多次怎么办?毕竟是一份清单。所以我认为如果最小值的索引,你应该返回一个列表
  • @AdelBoutros 如果这是 OP 想要的,这个解决方案可以作为起点并加以改进。
  • @MarimuthuMadasamy 谢谢兄弟..你是英雄..,master maind
  • 这不是迭代列表两次吗?
【解决方案2】:

这应该使用内置函数来完成。

public static int minIndex (ArrayList<Float> list) {
  return list.indexOf (Collections.min(list)); }

【讨论】:

    【解决方案3】:

    试试这个:

    public int getIndexOfMin(List<Float> data) {
        float min = Float.MAX_VALUE;
        int index = -1;
        for (int i = 0; i < data.size(); i++) {
            Float f = data.get(i);
            if (Float.compare(f.floatValue(), min) < 0) {
                min = f.floatValue();
                index = i;
            }
        }
        return index;
    }
    

    【讨论】:

    • Float.compare(f.floatValue(), min) &lt; 0 可以更改为f &lt; min。和min = f.floatValue()min = f。包装类被隐式地转换为它们的原始等价物。
    • @Dukeling,你的意思是 f
    • 不,我的意思是 f &lt; min(来自 Float.compare 的文档:“如果 f1 在数值上等于 f2,则返回值 0;如果 f1 在数值上小于 f2,则返回值小于 0;如果 f1 在数值上大于 f2,则值大于 0")。除非是指Float.compare(f.floatValue(), min) &lt;= 0(即f &lt;= min)。
    • @Dukeling 委托给 Float.compare 将避免比较 NaN 的错误行为
    【解决方案4】:

    有一种更简单的方法可以在数组列表中找到最小整数:

    int min = array.get(0);
            for (int i : array){
                min = min < i ? min : i;
            }
    

    【讨论】:

    • 那么索引呢?
    【解决方案5】:
    public static int minIndex (ArrayList<Float> list) {
      return list.indexOf (Collections.min(list));
     }
    System.out.println("Min = " + list.get(minIndex(list));
    

    【讨论】:

      【解决方案6】:
      1. 用浮点数声明一个数组列表。

      2. Collection.min() - 查找列表中的最小元素。

      3. List.indexOf() - 查找最小元素的索引。

      public class Test {
      
          public static void main(String[] args) {
      
              ArrayList<Float> ary = new ArrayList<Float>();
              ary.add((float) 3.0);
              ary.add((float) 6);
              ary.add((float) 2);
              ary.add((float) 1.3);
              ary.add((float) 4.2);
              int indx = minIndex(a);
              System.out.println(indx);
          }
      
          public static int minIndex(ArrayList<Float> list) {
              return list.indexOf(Collections.min(list));
          }
      
      }
      

      【讨论】:

        【解决方案7】:

        你必须遍历整个数组并保留两个辅助值:

        • 你找到的最小值(在你接近终点的路上)
        • 找到最小值的位置的索引

        假设您的数组名为myArray。在这段代码的末尾 minIndex 有最小值的索引。

        var min = Number.MAX_VALUE; //the largest number possible in JavaScript
        var minIndex = -1;
        
        for (int i=0; i<myArray.length; i++){
           if (myArray[i] < min){
              min = myArray[i];
              minIndex = i;
           }
        }
        

        这是假设最坏的情况:一个完全随机的数组。这是一个 O(n) 算法或 order n 算法,这意味着如果您的数组中有 n 个元素,那么您必须先查看所有元素才能知道您的回答。 O(n) 算法是最糟糕的,因为它们需要大量时间来解决问题。

        如果您的数组已排序或具有任何其他特定结构,则可以优化算法以更快。

        话虽如此,除非您拥有包含数千个值的庞大数组,否则不必担心优化问题,因为 O(n) 算法和更快的算法之间的差异不会很明显。

        【讨论】:

          【解决方案8】:

          这就是我所做的。我首先找到最小值,然后在找到最小值之后,将其从 ArrayList 中删除。

          ArrayList<Integer> a = new ArrayList<>();
          a.add(3);
          a.add(6);
          a.add(2);
          a.add(5);
          
          while (a.size() > 0) {
              int min = 1000;
              for (int b:a) {
                  if (b < min)
                      min = b;
              }
              System.out.println("minimum: " + min);
              System.out.println("index of min: " + a.indexOf((Integer) min));
              a.remove((Integer) min);
          }
          

          【讨论】:

            猜你喜欢
            • 2021-08-05
            • 1970-01-01
            • 2015-06-07
            • 1970-01-01
            • 2021-03-11
            • 1970-01-01
            • 2018-01-29
            • 1970-01-01
            • 2016-01-04
            相关资源
            最近更新 更多