如何使Set中的元素始终是第一个元素

时间:2014-04-03 19:23:39

标签: java

我有一个树集,里面有很多元素。我按字母顺序排列它们。我是否真的可以让元素始终是第一个元素而不会打扰排序顺序?

例如:我希望“partnumber”元素始终是集合中的第一个元素。可以吗? 在此先感谢!!

6 个答案:

答案 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。像其他人所说的那样使用比较器,你会没事的。