【问题标题】:How to select between the elements having a certain priority list?如何在具有一定优先级列表的元素之间进行选择?
【发布时间】:2015-07-01 17:35:42
【问题描述】:

我是编程新手,我正在尝试编写一种方法来选择列表中的最佳选项。这是我所拥有的:

item_no      item_type      origin             
10               2             US
10               2             FR 
10               4             UK
11               6             FR 

我把这些放在一个列表中:

[[10, 2, US], [10, 2, FR], [10, 4, UK], [11, 6, FR]] 

我将在我的方法中使用此列表,并且我还有一个具有某些功能的特定项目。让我们选择我的具体项目为;

item_no   item_type   origin 
10           4            GE

现在,我想要做的是,如果列表中的某个项目的优先级高于我的项目,我将使用更高优先级项目的特征更新我的项目的特征。优先级逻辑分别取决于item_codeitem_typeorigin。为了获得优先顺序,我使用如下地图:

HashMap<String, Integer> itemCodeOrder = x.getItemCodeOrder();      
HashMap<String, Integer> itemTypeOrder = y.getItemTypeOrder(); 
HashMap<String, Integer> originOrder = z.getOriginOrder()

一个典型的优先顺序是这样的:

  • itemCodeOrder : 12, 10, 11
  • itemTypeOrder : 6, 2, 4
  • originOrder : 美国、英国、法国、GE

首先,我想在列表中选择优先级更高的项目,然后将该项目与我的项目进行比较以进行更新与否。例如,在上面的列表中item_no 10 的优先级高于11,所以我将选择具有item_no 10 的项目之一。然后,我将查看item_type:我有24,现在我将选择带有2 的项目之一。所以在查看origin 之后,我会得到[10, 2, US],最后我会将它与我的项目进行比较,更新如下:

 item_no   item_type   origin 
    10           2       US

我想编写一个通用代码,但我找不到使用 HashMap 逻辑获取列表中前一项的正确方法。我该如何处理?

【问题讨论】:

  • 您可以编写项目比较器并按优先级对列表进行排序。然后对于特定项目,只需查找列表是否具有更大的优先级。
  • 正如 Stanislav 评论的那样,您需要的是一份好的比较器工作。您可以使用包含优先级字典作为构造函数参数的映射来创建它。

标签: java algorithm list hashmap


【解决方案1】:

首先,创建一个比较器,它将首先与code 进行比较,然后是type,最后是origin

Comparator<Item> comparator = new Comparator<Item>() {

    Map<String, Integer> codes = x.getItemCodeOrder();      
    Map<String, Integer> types = y.getItemTypeOrder(); 
    Map<String, Integer> origins = z.getOriginOrder();

    @Override
    public int compare(Item a, Item b) {

        int byCode = Objects.requireNonNull(codes.get(a.code))
                       .compareTo(Objects.requireNonNull(codes.get(b.code)));

        if (byCode == 0) {
            int byType = Objects.requireNonNull(types.get(a.type))
                           .compareTo(Objects.requireNonNull(types.get(b.type)));

            if (byType == 0) {
                return Objects.requireNonNull(origins.get(a.origin))
                         .compareTo(Objects.requireNonNull(origins.get(b.origin)));

            } else 
                return byType;

        } else 
            return byCode;
    }
};

然后,对您的项目列表进行排序:

Collections.sort(items, comparator);

列表中的最新项目现在具有最高优先级。


附:如果在排序前对所有列表项进行空值检查,Objects.requiresNonNull() 包装可以很容易地省略。

【讨论】:

  • 非常感谢。这就是我要找的:)
猜你喜欢
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 2012-04-21
  • 2020-05-04
  • 1970-01-01
相关资源
最近更新 更多