我有一个树集,里面有很多元素。我按字母顺序排列它们。我是否真的可以让元素始终是第一个元素而不会打扰排序顺序?
例如:我希望“partnumber”元素始终是集合中的第一个元素。可以吗? 在此先感谢!!
答案 0 :(得分:1)
只需创建一个新的Collection
,然后首先添加所需的元素,然后按照您想要/需要的方式添加其余元素。例如,您说您有一个TreeSet<String>
,其中包含您的所有数据,然后您可以使用List
来存储您想要/需要的所有数据。这是一个启动示例:
TreeSet<String> myTreeSet = ...
//...
//fill the data in treeSet...
//...
List<String> realData = new ArrayList<String>();
realData.add("partnumber");
realData.addAll(myTreeSet);
如果你使用Comparator<String>
实现(或你使用的类),只需确保"partnumber"
总是较小的值,否则进行真正的比较:
class MyPartNumberStringComparator implements Comparator<String>() {
static final String PART_NUMBER = "partNumber";
@Override
public int compare(String s1, String s2) {
if (PART_NUMBER.equals(s1) && s1.equals(s2)) {
return 0;
}
return (PART_NUMBER.equals(s1)) ? -1 :
(PART_NUMBER.equals(s2)) ? 1 :
s1.compareTo(s2);
}
}
答案 1 :(得分:1)
这应该允许您向任何Set
添加头元素。
public class HeadSet<T> extends AbstractSet<T> implements Set<T> {
// The extra item to add at the head.
final T head;
// The rest of the items.
final Set<T> body;
public HeadSet(T head, Set<T> body) {
this.head = head;
this.body = body;
}
@Override
public Iterator<T> iterator() {
// Iterator starts with the head element and then delegates to the body iterator.
return new Iterator<T>() {
private T next = head;
private Iterator<T> i = body.iterator();
@Override
public boolean hasNext() {
if (next == null && i.hasNext()) {
next = i.next();
}
return next != null;
}
@Override
public T next() {
if (hasNext()) {
T n = next;
next = null;
return n;
} else {
throw new NoSuchElementException();
}
}
};
}
@Override
public int size() {
// Size is one more than the size of the body.
return 1 + body.size();
}
}
public void test() {
Set<String> bodySet = new TreeSet<>(Arrays.asList("One", "Two"));
Set<String> mySet = new HeadSet("Choose part number ...", bodySet);
System.out.println(mySet);
}
答案 2 :(得分:0)
您可以使用LinkedHashSet
并按照所需的顺序插入每个项目,也可以向Comparator
提供自定义TreeSet
以正常排序“(无论这对您的实施意味着什么),但要考虑部件号在其他任何事情之前发生。
如果您要将TreeSet
工具Comparable
放入对象,则可以覆盖compareTo
方法以添加部件编号的特殊处理。
要实现Comparator
,它看起来像这样:
import java.util.Comparator;
public class MyComparator implements Comparator<MyDomainClass> {
@Override
public int compare(MyDomainClass o1, MyDomainClass o2) {
// compare the objects here and return a negative integer, zero,
// or a positive integer as the first argument is less than, equal
// to, or greater than the second
return 0; // stub
}
}
然后在创建TreeSet
时,您可以将自定义Comparator
作为参数传递给构造函数:
TreeSet<MyDomainClass> ts = new TreeSet<MyDomainClass> (new MyComparator());
答案 3 :(得分:0)
之前解决这个问题的方法是让两个集合一个列表,另一个集合列表。当我必须显示数据时,我按顺序迭代这两个集合。
常见用例将填充下拉列表中的国家/地区列表。 你想要&#39;无&#39;和&#39;美国&#39;作为前两个项目,但您想要排序的其他国家。
答案 4 :(得分:0)
您可以制作自己的比较器,它看起来像这样:
public class comparatorSet implements Comparator<Element type>{
public int compare(Type e1, Type e2){
Integer res=0;
if(e1.equals(firstelement)){
res=-1;
}
else if(e2.equals(firstelement)){
res=1;
}
else{
res=e1.compareTo(e2);
}
return res;
}
}
答案 5 :(得分:0)
我不知道您是否绝对需要使用Set,如果您使用Max Heap,无论您是插入还是删除任何内容,它都将始终保持最高值。所有你需要的是一个arraylist。像其他人所说的那样使用比较器,你会没事的。