如何在具有特定优先级列表的元素之间进行选择?

时间:2015-04-23 13:32:40

标签: java algorithm list hashmap

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

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:US,UK,FR,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逻辑获取列表中的上一个项目。我怎么能处理这个?

1 个答案:

答案 0 :(得分:6)

首先,创建一个比较器,首先按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);

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

P.S。如果在排序之前对所有列表项执行空值检查,则可以轻松省略Objects.requiresNonNull()换行。