【问题标题】:Finding a primitives position within a List在列表中查找基元位置
【发布时间】:2018-03-16 15:31:24
【问题描述】:

给定以下代码:

     for (int i = 0; i < noRooms; i++) {
        String roomPrice = response.xmlPath().getString("ABC_AvailRS.AccommodationSearchResponse.Accommodations.AccommodationSegment[0].AccommodationUnits.AccommodationUnit[" + i + "].RoomRate.@Amount");
        roomPrices.add(roomPrice);
        List<Float> floatRoomPrices = roomPrices.stream()
                .map(Float::parseFloat)
                .collect(Collectors.toList());

        float min = floatRoomPrices.stream().min(Float::compare).get();
        float max = floatRoomPrices.stream().max(Float::compare).get();

    }

...在其中我可以获取一个金额列表作为字符串 Amount="92.65",将它们转换为浮点数并添加到一个列表中,我可以清楚地找到最高和最低金额。

  1. 如何获得 floatRoomPrices 的中间值?
  2. 如何在列表中找到它的位置,例如[4] 如果是 10 个浮点值的中间值?

【问题讨论】:

  • 对列表进行排序。然后你就知道你的最小值、最大值和中间值在哪里了。
  • 通常数组或长度为 n 的列表的中点位于n/2。所以只需像floatRoomPrices.sort(Float::compare) 一样对你的浮动进行排序;然后midPoint = floatRoomPrices.get(floatRoomPrices.size()/2);
  • @arthur - 谢谢
  • 为什么在每次循环迭代中都重复该操作?

标签: java arrays list java-8 java-stream


【解决方案1】:

您可以通过排序列表快速找到此信息。这是一个简单的例子。

    public static void main(String[] args) {
         List<Float> floats = new ArrayList<>();
         floats.add(7.85f);
         floats.add(0.85f);
         floats.add(9.01f);
         floats.add(2.78f);
         Collections.sort(floats); // in ascending order, adjust sorting method as preferred - maybe you can utilize stream().sorted

         float min = floats.get(0);
         float max = floats.get(floats.size() - 1);
         int midIndex = floats.size() / 2; // Answer to #2
         float midValue = floats.get(midIndex); // Answer to #1

         System.out.println("Min: " + min + "\nMax: " + max + "\nMid index: " + midIndex + "\nMid value: " + midValue);
    }

这给出了输出:

最小值:0.85
最大:9.01
中指数:2
中间值:7.85

【讨论】:

  • 谢谢,太好了 - 但我如何在集合中获取它的索引值?
  • 中间索引是索引值。 [0.85, 2.78, 7.85, 9.01] -> 2 是中间值所在的索引。如果这不是您要查找的内容,您能改写一下吗?
  • 对不起,我是愚蠢和匆忙-完美回答-谢谢
  • When to use LinkedList over ArrayList?(剧透:几乎从不)。但是,在这个特定的用例中,根本没有理由使用 List。使用double[] doubleRoomPrices = roomPrices.stream() .mapToDouble(Double::parseDouble).toArray();;如果您愿意,您可以将最终结果值转换为float。在float 中执行计算没有优势,有时甚至更慢。在盒装Float 的情况下,它大部分时间都比较慢……
  • @Holger 不确定我为什么使用 LinkedList。显然是时候喝咖啡了。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多