Вы можете использовать настроенный Comparator
напрямую с помощью метода Collections.sort()
из java.util.Collections
API. Вот рабочий пример копирования и вставки:
public class SortByList {
enum Brand {
ADIDAS, ARMOR, NIKE
}
static class BrandMap extends TreeMap<Brand, String> {
public BrandMap(Brand brand, String type) {
put(brand, type);
}
}
public static void main(String[] args) {
List<String> orderList = new ArrayList<>();
orderList.add("ARMOR");
orderList.add("ADIDAS");
orderList.add("NIKE");
List<TreeMap<Brand, String>> brands = new ArrayList<>();
brands.add(new BrandMap(Brand.NIKE, "Shoes"));
brands.add(new BrandMap(Brand.ADIDAS, "Clothing"));
brands.add(new BrandMap(Brand.ARMOR, "Backpacks"));
brands.add(new BrandMap(Brand.NIKE, "Shorts"));
brands.sort((o1, o2) -> {
Brand key1 = o1.keySet().iterator().next();
Brand key2 = o2.keySet().iterator().next();
int index1 = orderList.indexOf(key1.name());
int index2 = orderList.indexOf(key2.name());
return Integer.compare(index1, index2);
});
//[{ARMOR=Backpacks},{ADIDAS=Clothing},{NIKE=Shoes},{NIKE=Shorts}]
System.out.println(brands);
}
}
Просто примечание: Я создал BrandMap
, чтобы легко сгенерировать тестовые данные и внести их в список. Вы можете оставить это и просто взять реализацию Comparator
, написанную на лямбда-выражении. Он должен работать.
Еще одно обновление: Если вы заботитесь о производительности, и ваш orderList
, вероятно, со временем станет больше, использование orderList.indexOf()
внутри функции сортировки не поможет . Потому что он выполняет последовательный поиск, который стоит O(N)
для каждого сравнения сортировки:
brands.sort((o1, o2) -> {
Brand key1 = o1.keySet().iterator().next();
Brand key2 = o2.keySet().iterator().next();
// extra iteration costs extra O(N)
int index1 = orderList.indexOf(key1.name());
// extra iteration costs extra O(N)
int index2 = orderList.indexOf(key2.name());
return Integer.compare(index1, index2);
});
Если это так, я предлагаю сохранить orderList
в HashMap
вместо List
или array
, если есть возможность. В качестве альтернативы вы можете преобразовать его за один раз и использовать свою карту перед операцией сортировки:
// this will cost O(N) only for once
Map<String, Integer> orderMap = new HashMap<>();
for (int i = 0; i < orderList.size(); i++) {
orderMap.put(orderList.get(i), i);
}
// then sort
brands.sort((o1, o2) -> {
Brand key1 = o1.keySet().iterator().next();
Brand key2 = o2.keySet().iterator().next();
// now use the map for getting indices in constant O(1) time
int index1 = orderMap.get(key1.name());
int index2 = orderMap.get(key2.name());
return Integer.compare(index1, index2);
});
Немного дополнительно: Конечно, хранение в HashMap
требует дополнительных затрат. O(N)
пространство, но я предполагаю, что потребление памяти в вашем случае допустимо.
Пожалуйста. Ура!