Java 按其他列表对列表树映射进行排序

Java 按其他列表对列表树映射进行排序,java,list,treemap,Java,List,Treemap,我看到了其他涉及数组列表的方法。虽然没有类似的 List<String> orderList = new ArrayList<>(); orderList.add("ARMOR"); orderList.add("ADIDAS"); orderList.add("NIKE"); I have my List<TreeMap<Brand,String>> brands returning this list. [{NIKE=Shoes},{ADI

我看到了其他涉及数组列表的方法。虽然没有类似的

List<String> orderList = new ArrayList<>();
orderList.add("ARMOR");
orderList.add("ADIDAS");
orderList.add("NIKE");

I have my List<TreeMap<Brand,String>> brands returning this list. 
[{NIKE=Shoes},{ADIDAS=Clothing},{ARMOR=Backpacks},{NIKE=Shorts}]
但我不知道怎么做。
也许还有其他方法可以将其修改为列表并重新排序,我不确定

您可以将
列表医嘱列表
转换为
HashMap indexMap

[“装甲”、“阿迪达斯”、“耐克”]
->
{“装甲”:0,“阿迪达斯”:1,“耐克”:2}

Map indexMap=IntStream.range(0,orderList.size())/[0,1,2]
.boxed()//使用int,而不是整数
.collect(Collectors.toMap(i->orderList.get(i),i->i));//向每个元素添加索引
然后,给定
TreeMap品牌
,您可以执行以下操作:

List result=brands.entrySet()
.stream()
.filter(entry->indexMap.contains(entry.getKey())//删除不在indexMap中的元素,因此也不在orderList中
.sorted((a,b)->Integer.compare(indexMap.get(a.getKey())、indexMap(b.getKey())//对所有现有品牌进行排序,以匹配订单列表中的订单
.collect(Collectors.toList());

您可以将
列表医嘱列表
转换为
HashMap indexMap

[“装甲”、“阿迪达斯”、“耐克”]
->
{“装甲”:0,“阿迪达斯”:1,“耐克”:2}

Map indexMap=IntStream.range(0,orderList.size())/[0,1,2]
.boxed()//使用int,而不是整数
.collect(Collectors.toMap(i->orderList.get(i),i->i));//为每个元素添加索引
然后,给定
TreeMap品牌
,您可以执行以下操作:

List result=brands.entrySet()
.stream()
.filter(entry->indexMap.contains(entry.getKey())//删除不在indexMap中的元素,因此也不在orderList中
.sorted((a,b)->Integer.compare(indexMap.get(a.getKey())、indexMap(b.getKey())//对所有现有品牌进行排序,以匹配订单列表中的订单
.collect(Collectors.toList());

您可以从
java.util.Collections
API将自定义的
比较器直接与
Collections.sort()
方法一起使用。下面是一个复制粘贴工作示例:

公共类SortByList{
enum品牌{
阿迪达斯、装甲、耐克
}
静态类BrandMap扩展树映射{
公共品牌地图(品牌品牌,字符串类型){
put(品牌、类型);
}
}
公共静态void main(字符串[]args){
List orderList=new ArrayList();
订单列表。添加(“装甲”);
订单列表。添加(“阿迪达斯”);
订单列表。添加(“NIKE”);
列表品牌=新的ArrayList();
品牌。添加(新品牌地图(Brand.NIKE,“Shoes”);
添加(新品牌地图(Brand.ADIDAS,“服装”);
添加(新的BrandMap(Brand.ARMOR,“背包”);
品牌。添加(新品牌地图(Brand.NIKE,“短裤”);
品牌。排序((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());
返回整数。比较(index1,index2);
});
//[{装甲=背包},{阿迪达斯=服装},{耐克=鞋子},{耐克=短裤}]
系统输出打印(品牌);
}
}
请注意:我创建了
BrandMap
,只是为了方便地生成测试数据并将其填充到列表中。您可以留下它,只需使用lambda表达式编写的
比较器
实现。它应该可以工作

另一个更新:如果您关心性能,并且您的
orderList
可能会在时间上变得更大,那么在sort函数中使用
orderList.indexOf()
将不会有什么好处。因为它会进行顺序搜索,每次排序比较都会花费
O(N)

brands.sort((o1,o2)->{
Brand key1=o1.keySet().iterator().next();
Brand key2=o2.keySet().iterator().next();
//额外迭代成本额外O(N)
int index1=orderList.indexOf(key1.name());
//额外迭代成本额外O(N)
int index2=orderList.indexOf(key2.name());
返回整数。比较(index1,index2);
});
如果是这种情况,我建议将您的
orderList
存储在
HashMap
中,而不是
List
array
中(如果有机会)。或者,您可以在一次操作中转换它,并在排序操作之前使用您的map:

//这只会花费一次O(N)
Map orderMap=newhashmap();
对于(int i=0;i{
Brand key1=o1.keySet().iterator().next();
Brand key2=o2.keySet().iterator().next();
//现在使用该映射以恒定的O(1)时间获取索引
int index1=orderMap.get(key1.name());
int index2=orderMap.get(key2.name());
返回整数。比较(index1,index2);
});
多一点:当然,存储在
HashMap
中需要额外的
O(N)
空间,但我认为在您的情况下,内存消耗是可以忍受的


不客气。干杯!

您可以直接使用
java.util.Collections
API中的
Collections.sort()
方法使用自定义的
比较器。下面是一个复制粘贴工作示例:

公共类SortByList{
enum品牌{
阿迪达斯、装甲、耐克
}
静态类BrandMap扩展树映射{
公共品牌地图(品牌品牌,字符串类型){
put(品牌、类型);
}
}
公共静态void main(字符串[]args){
List orderList=new ArrayList();
订单列表。添加(“装甲”);
订单列表。添加(“阿迪达斯”);
订单列表。添加(“NIKE”);
列表品牌=新的ArrayList();
品牌。添加(新品牌地图(Brand.NIKE,“Shoes”);
添加(新品牌地图(Brand.ADIDAS,“服装”);
品牌。添加(新的品牌地图(Brand.ARM
[{ARMOR=Backpacks},{ADIDAS=Clothing},{NIKE=Shoes},{NIKE=Shorts}]
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

enum Brand {
    ARMOR, ADIDAS, NIKE
}

public class Main {
    public static void main(String[] args) {

        List<String> orderList = new ArrayList<>();
        orderList.add("ARMOR");
        orderList.add("ADIDAS");
        orderList.add("NIKE");

        List<Map<Brand, String>> list = List.of(Map.of(Brand.NIKE, "Shoes"), Map.of(Brand.ADIDAS, "Clothing"),
                Map.of(Brand.ARMOR, "Backpacks"), Map.of(Brand.NIKE, "Shorts"));

        List<Map<Brand, String>> sortedList = new ArrayList<Map<Brand, String>>();

        // Sorting
        for (String s : orderList) {
            for (Map<Brand, String> map : list) {
                for (Entry<Brand, String> entry : map.entrySet()) {
                    if (s.equals(entry.getKey().toString())) {
                        sortedList.add(map);
                    }
                }
            }
        }

        // Display the sorted list
        System.out.println(sortedList);
    }
}
[{ARMOR=Backpacks}, {ADIDAS=Clothing}, {NIKE=Shoes}, {NIKE=Shorts}]