我是编程新手,我试图编写一种方法,选择列表中的最佳选项。这就是我所拥有的:
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_code
,item_type
和origin
。要获得优先顺序,请使用以下地图:
HashMap<String, Integer> itemCodeOrder = x.getItemCodeOrder();
HashMap<String, Integer> itemTypeOrder = y.getItemTypeOrder();
HashMap<String, Integer> originOrder = z.getOriginOrder()
典型的优先顺序是这样的:
首先,我想在列表中选择优先级较高的项目,然后将该项目与我的项目进行比较以进行更新。例如,在上面的列表中,item_no 10
的优先级高于11
,因此我将选择其中一个具有item_no 10
的项目。然后,我会查看item_type
:我有2
和4
,现在我将选择2
项目中的一个。因此,在查看origin
之后,我最终会得到[10, 2, US]
,我会将其与我的项目进行比较,更新如下:
item_no item_type origin
10 2 US
我想编写一个通用代码,但我找不到一个正确的方法来使用HashMap
逻辑获取列表中的上一个项目。我怎么能处理这个?
答案 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()
换行。