在Guava中,给定了Collection<E>一个我认识e的类型和元素元素E,我想创建一个首先Ordering<E>排序的自定义,e然后是集合的其余部分.然而,到达那里的方式似乎非常复杂:
Collection<String> values = ImmutableList.of("apples", "oranges", "pears");
String first = "oranges";
List<String> remainingValues = newArrayList(values); // this
remainingValues.remove(first); // seems
Ordering<String> myOrdering = // very
Ordering.explicit(first, remainingValues.toArray( // complicated!
new String[remainingValues.size()])); // is there an easier way?
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的事情:
Ordering.explicit(first);
Run Code Online (Sandbox Code Playgroud)
(我希望这可以排序first到开头并保留所有其他元素的顺序,但是文档说生成的Ordering会抛出一个ClassCastException未明确列出的元素.)
或者像这样:
Ordering.explicit(first, values.toArray(/* etc */));
Run Code Online (Sandbox Code Playgroud)
(但这会失败,因为它first会是一个重复的值)
有人能想出一个简洁的方法来做我想做的事吗?
顺便说一句,它不一定是一个Ordering,也可能是Iterable在指定的订单中创建一个变通方法,但同样,这是非常复杂的:
Iterable<String> sorted = Iterables.concat(
ImmutableList.of(first),
Iterables.filter(values, not(equalTo(first))));
Run Code Online (Sandbox Code Playgroud) Thare是两个输入列表,如下所示:
inputA = [
{
name: "A",
age: 20
},
{
name: "B",
age: 30
},
{ name: "C",
age: 25
},
{ name: "D",
age: 28
}
]
inputB = ["D", "B"]
Run Code Online (Sandbox Code Playgroud)
我首选的输出列表必须如下:
expectedOutput = [
{
name: "D",
age: 28
},
{
name: "B",
age: 30
},
{ name: "A",
age: 20
},
{ name: "C",
age: 25
}
]
Run Code Online (Sandbox Code Playgroud)
到目前为止我所做的事情如下所示:
AtomicInteger count = new AtomicInteger();
Collections.sort(inputA, Comparator
.comparing(a ->
if (inputB.indexOf(a.getName()) > -1) {
return -1;
} …Run Code Online (Sandbox Code Playgroud)