【问题标题】:max value from arraylist part?来自arraylist部分的最大值?
【发布时间】:2016-01-08 13:13:53
【问题描述】:

我在 ArrayList1 中存储了一些 int 值(想象一个包含一列的表)。我需要创建另一个 ArrayList2(第二列),它将具有值,即 ArrayList1 中某个范围的最大值,例如最后 3 个值。例如:

1 null
2 null
1 2
3 3
2 3
1 3

因此,第二列 - ArrayList2 将包含 ArrayList1 中最后 3 个对应行的每一行的最大值。 (与 xls 相同,B3=MAX(A1:A3)...)。 我可以通过为每一行创建一个循环并找出最大值来做到这一点,或者我可以循环并创建 subArrayList 并使用 collections.max,但这两种解决方案都需要每一行都有一个循环,这不是很实用,没有更简单的方法吗?像 arrayList.max(1,3) 这样的东西可以直接得到数字吗?

【问题讨论】:

  • 范围(最后 3 个值)是否为常数?
  • @sanbhat 我相信 OP 正在寻找一种方法,以防列表较长且最后一个最大值可能不是恒定的
  • 我希望成为灵活的 3 号,如果我需要它是 200,例如在 100000 长的数组列表中,只需像我提到的 xls 函数那样坑一下
  • 我有一个问题:arraylist2 中的第二行应该发生什么?为什么当我们从第一个数组列表的 {2,1,3} 中获得最大值 3 时它为空
  • 反之,对不起,更不用说,它应该查找前 3 个,因为在第 2 行中没有前 3 个要查找,所以它从第 3 行开始,并查看第 1 行-3,同样的原则,如果我需要 100 个元素中的最大值,我可以在第 100 行中获得第一个值

标签: java arraylist max


【解决方案1】:

您可以执行如下所示的代码。您迭代第一个数组,计算最大值并相应地更新第二个数组。请注意,您需要一个额外的数组来存储间隔。

private void m1(List<Integer> array1, List<Integer> array2, int range) {

    Integer[] rangeArray = new Integer[range];

    //Iterate first array

    for(int i = 0; i < array1.size(); i++) {

        Integer x = array1.get(i);

        rangeArray[i%range] = x;

        //Update second array

        if(i < range - 1) {
            array2.add(null);
        }
        else {
            int max = Collections.max(Arrays.asList(rangeArray));
            array2.add(max);
        }
    }
}

【讨论】:

  • 感谢您的回答:),有时我真的被卡住了,看不到明显的解决方案,主要是因为我昨天对移动平均线做了基本相同的操作:P
  • 我刚刚(略微)更新了算法,因为我误解了您只想计算 N 个元素的子列表的最大值(即 N 个范围)
  • 另请注意,该算法工作得很好,但如果将“rangeArray”表示为最大堆(而不是静态数组)会更有效。
【解决方案2】:

使用 Collections.max

    int startFrom = 2; // configurable number
    List<Integer> intList = Arrays.asList(1,2,1,3,2,1,4);
    List<Integer> sortedList =  new ArrayList<>();
    for (int i = 0; i < intList.size(); i++) {
        if(i < startFrom){
            sortedList.add(null);
            continue;
        }
        ArrayList<Integer> list = new ArrayList<Integer>(intList.subList(i -startFrom, i+1));
        sortedList.add(Collections.max(list));
    }
    System.out.println(sortedList);

输出为:[null, null, 2, 3, 3, 3, 4]

【讨论】:

    【解决方案3】:

    好的。因此,您要比较的列表大小可能会有所不同,在这种情况下,从要比较的数字中构建一个数组列表,例如 List&lt;?&gt; list = Arrays.asList( numbersToCompare ); 然后Collections.max( list ),列表应该包含可以比较的对象,换句话说需要可比较。 (如果不写自己的比较器)

    【讨论】:

    • 谢谢,但是从 200 个元素中获取最大值可能会出现问题,我需要元素编号可以轻松更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多