【问题标题】:Get the element with the highest priority based on another list in Java根据Java中的另一个列表获取具有最高优先级的元素
【发布时间】:2020-04-21 23:00:49
【问题描述】:

我有一个优先级列表

List<String> priorities = Arrays.asList("NV","PH","OO","DR");

我有一个项目列表List&lt;Item&gt; availableItems,其中项目有一个名为type 的属性,它可以是第一个列表中的值之一。

所以我正在研究一种方法,它返回一个元素(最高优先级),我正在做一些比较器和排序的事情,但我正在阅读它,据说它需要很长时间,因为 availableItems可以有很多元素,所以可能是O(NLogN)

我想要实现的是,如果有一个带有typeNV 的元素返回是因为是最高优先级,如果不是带有PH 的元素等等,如果没有一个元素,然后返回列表的任何元素,因为它们没有,但是没有使用比较器或者成本不高

【问题讨论】:

  • 您可以通过对无序列表进行一次迭代来实现此目的;但是,只有在找到 type"NV" 的元素时才能短路
  • 您可以使用 TreeMap ,其中整数是优先级编号。 1 - NV、2 - PH 等。然后您只需获取第一个键值对。
  • 请提供MCVE,其中包括您的尝试,即使它不起作用。

标签: java arrays performance java-8


【解决方案1】:

基于@Gilbert Le Blanc 评论。

TreeMap<Integer, List<Item0>> groupByType = availableItems.stream()
          .collect(Collectors.groupingBy(item -> priorities.indexOf(item.getType()),
                                                TreeMap::new, Collectors.toList()));

System.out.println(groupByType.firstEntry().getValue().get(0));

【讨论】:

    【解决方案2】:

    我建议将PriorityQueue 与基于索引的比较器一起使用:

    public static <T> Comparator<T> comparatorByIndex(List<T> list) {
      Map<T, Integer> priority = IntStream.range(0, list.size()).boxed().collect(Collectors.toMap(list::get, Function.identity()));
      return Comparator.comparing(k -> priority.getOrDefault(k, Integer.MAX_VALUE));
    }
    

    并获得具有最高优先级的字符串,例如:

    List<String> priorities = Arrays.asList("NV","PH","OO","DR");
    Queue<String> priorityOrder = new PriorityQueue<>(comparatorByIndex(priorities));
    priorityOrder.addAll(availableItems);
    
    String highestPriority = priorityOrder.poll();
    

    【讨论】:

    • PriorityQueue 仅在打算获取更多元素时才有用。否则,一个简单的Collections.min(availableItems, comparatorByIndex(priorities)) 就足够了,并且时间复杂度为 O(n),这似乎是 OP 关心的问题。或者,availableItems.stream().min(comparatorByIndex(priorities))
    • @Holger 你是对的,如果你只想要最高元素Stream#minCollections#min 是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多