【问题标题】:How do I find the index of the maximum value in an ArrayList<Integer>? [duplicate]如何在 ArrayList<Integer> 中找到最大值的索引? [复制]
【发布时间】:2019-10-11 21:59:49
【问题描述】:

我正在编写一个程序来计算每个唯一单词在文本文件中出现的次数,然后返回出现次数最多的单词以及它出现的次数。因为我不知道会有多少不同的单词,所以我不能使用数组,因为我无法预测它需要多大。因此我使用了两个并行的 ArrayList。 myWords 是字符串列表,myFreqs 是整数列表,因此 myFreqs 中的每个索引都包含存储在 myWords 的同一索引中的单词的出现次数。

为此,我尝试编写一个 for 循环来标识 myFreqs 中包含最高值的索引。我正在努力编写这个循环,因为 ArrayList 没有 .length() 方法,所以我不确定在循环中编写停止条件的最佳方法。我尝试使用

将 ArrayList 转换为 Array
        myFreqs.toArray(<Integer> array);

这样我就可以获得数组的长度,但这会给我带来编译时错误。我已经尝试了上面几个稍微不同的版本,我得到了“非法的表达式开始”错误或“无法从静态上下文引用非静态方法”错误。我感觉有一种更简单、更直接的方法来实现我所忽略的我想要的东西。

private ArrayList<String> myWords;
private ArrayList<Integer> myFreqs;

public int findIndexOfMax () {
    int[] array = new Array[100];
    myFreqs.toArray(<Integer> array);
    int maxVal = 0;
    int maxIdx = -1;
    for (int k = 0; k < array.length; k++) {
        if (array[k] > maxVal) {
            maxVal = array[k];
            maxIdx = k;
        }
    }
    return maxIdx;
}

【问题讨论】:

  • 使用Map而不是管理两个列表不是更容易吗?
  • 旁注:不能保证只有一种解决方案。多个单词可以同样频繁地出现。

标签: java arraylist


【解决方案1】:

Samuel Philipp 的回答非常好,但是,您无需转换为 array 即可获得 List 的长度。 不要将ArrayList 转换为数组int[],而是使用List.size() 方法来获取列表中的元素数。

【讨论】:

    【解决方案2】:

    可以使用Java Streams获取最大值的索引:

    int index = IntStream.range(0, myFreqs.size()).boxed()
            .max(Comparator.comparingInt(myFreqs::get))
            .orElse(-1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      相关资源
      最近更新 更多