在开始升序时对具有特定元素的集合进行排序
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
字段比较 Props
:
Comparator.comparing(Props::getName)
- 在构造函数中使用此比较器创建两个
TreeSet
:
new 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;
}
}
我有一组具有 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
中的元素过滤 - 创建一个比较器
cmp
,通过name
字段比较Props
:Comparator.comparing(Props::getName)
- 在构造函数中使用此比较器创建两个
TreeSet
:new TreeSet<>(cmp)
- 现在您有两个按名称排序的集合:
[a, c, f, test]
和[abc, hello]
- 以正确的顺序将两个集合添加到
LinkedHashSet
中。
props
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;
}
}