【发布时间】:2019-02-06 18:05:46
【问题描述】:
有两个输入列表如下:
inputA = [
{
name: "A",
age: 20
},
{
name: "B",
age: 30
},
{ name: "C",
age: 25
},
{ name: "D",
age: 28
}
]
inputB = ["D", "B"]
我的首选输出列表必须如下:
expectedOutput = [
{
name: "D",
age: 28
},
{
name: "B",
age: 30
},
{ name: "A",
age: 20
},
{ name: "C",
age: 25
}
]
到目前为止我所做的如下所示:
AtomicInteger count = new AtomicInteger();
Collections.sort(inputA, Comparator
.comparing(a ->
if (inputB.indexOf(a.getName()) > -1) {
return -1;
}
else {
return count.incrementAndGet();
})
.thenComparingInt(a -> a.getAge()));
我得到的输出如下
actualOutput = [
{
name: "D",
age: 28
},
{
name: "B",
age: 30
},
{ name: "C",
age: 25
},
{ name: "A",
age: 20
}
]
问题在于列表inputB 中没有名称的元素。那里的订单在inputA 中没有原始订单。要使原始订单保持不变,{ name: "A", age: 20 } 应该在 { name: "C", age: 25 } 之前
在使用比较器链接策略时如何解决此问题?
更新 排序逻辑是,如果 inputA 具有名称等于 inputB 列表的对象,则这些元素应位于 inputA 的顶部,然后这些元素必须按其年龄排序,同时保持 inputA 中其他元素的原始顺序输入B中不存在
这不可能是重复的,因为这个问题试图比较两个列表,并根据第一个列表中对象的属性对公共元素进行排序,同时将其余元素保持原始顺序。
【问题讨论】:
-
应该是
.thenComparingInt而不是comparingInt? -
我很想知道在其他情况下使用
return count.incrementAndGet();进行处理的原因是什么。问题出在哪里 -
您订购商品的规则是什么?
-
@Joe 这怎么可能与您所说的问题重复?只需正确阅读问题,并将此问题的两个公认答案与您所指的问题进行比较
标签: java lambda java-8 java-stream comparator