相关疑难解决方法(0)

Guava:如何从List和单个元素创建显式排序?

在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)

java comparator guava

12
推荐指数
1
解决办法
6135
查看次数

使用Java Comparators按另一个List对对象列表进行排序

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)

java lambda comparator java-8 java-stream

8
推荐指数
1
解决办法
165
查看次数

标签 统计

comparator ×2

java ×2

guava ×1

java-8 ×1

java-stream ×1

lambda ×1