在开始升序时对具有特定元素的集合进行排序

Sort set with specific elements at beginning ascending

我有一组具有 name 属性的对象。其中一些对象应按升序显示在集合的开头,其余对象也应在开头的元素之后按升序排序。集内评论为集内内容

这里有一些例子:

预期输出为 ("abc", "hello", "a", "c", "f", "test")

Set<Props> props = handler.getProps(); //("test", "abc", "c", "f", "hello", "a")
Set<Props> unnecessaryProps = handler.getUnnecessaryProps(); //("hello", "abc")

Comparator comparator = new Comparator<Props>() {

    @Override
    public int compare(Props e1, Props e2) {
        if (e1.equals(e2)) {
            return 0;
        }
        if (unnecessaryProps.contains(e1)) {
            return -1;
        }
        if (unnecessaryProps.contains(e2)) {
            return 1;
        }
        return e1.compare(e2);
        }
    };
}

有人能帮帮我吗?

TreeSet 有一个带有比较器参数的构造函数。您可以使用它来创建排序集。然后你可以将两个排序集添加到 LinkedHashSet 以保持正确的顺序。

  • 创建一组 name 个字段 (unlist) 以按 unnecessaryProps
  • 中的元素过滤 props
  • 创建一个比较器 cmp,通过 name 字段比较 PropsComparator.comparing(Props::getName)
  • 在构造函数中使用此比较器创建两个 TreeSetnew TreeSet<>(cmp)
  • 现在您有两个按名称排序的集合:[a, c, f, test][abc, hello]
  • 以正确的顺序将两个集合添加到 LinkedHashSet 中。

Set<String> unlist = unnecessaryProps.stream().map(Props::getName).collect(Collectors.toSet());

Set<Props> output = new LinkedHashSet<>();
Comparator<Props> cmp = Comparator.comparing(Props::getName);

Set<Props> propstr = new TreeSet<>(cmp);
propstr.addAll(props.stream().filter(p -> !unlist.contains(p.getName())).collect(Collectors.toSet()));

Set<Props> unstr = new TreeSet<>(cmp);
unstr.addAll(unnecessaryProps);

output.addAll(unstr);
output.addAll(propstr);

System.out.println(output);

输出:

[abc, hello, a, c, f, test]

我假设 Props class 有一个 toString() 方法来打印 name 值:

public class Props {
    // ...

    @Override
    public String toString() {
        return name;
    }
}