使用HashSet时如何维护插入顺序?

时间:2019-07-04 20:55:17

标签: java hashset

我需要维护一组中最近插入的订单。

Set<Intger> s = new HashSet<>();
s.add(1);
s.add(2);
s.add(3);
s.add(1);
print(s);

使用LinkedHashSet()时,顺序为(1,2,3)。 我要的顺序是(2,3,1)。我想要一种将集合的属性与堆栈的属性组合在一起的有效方法。

4 个答案:

答案 0 :(得分:0)

非常简单,只需制定一种方法来判断该集合是否具有需要添加的值,如果是 删除它,然后添加它,如果不只是添加它。

这是方法。

package exercise.setInsertionOrder;

import java.util.LinkedHashSet;
import java.util.Set;

public class SetInsertionOrder {

    public static void main(String[] args) {
        Set<Integer> s = new LinkedHashSet<>();
        /*s.add(1);
        s.add(2);
        s.add(3);
        s.add(1);*/
        addByJudgeValueIsAdded(s, 1);
        addByJudgeValueIsAdded(s, 2);
        addByJudgeValueIsAdded(s, 3);
        addByJudgeValueIsAdded(s, 1);
        System.out.println(s);
    }


    public static <T> void addByJudgeValueIsAdded(Set<T> set,T t){
        if(set.contains(t)){
            set.remove(t);
            set.add(t);
        }else{
            set.add(t);
        }
    }

}

这是结果。

  

[2,3,1]

答案 1 :(得分:0)

如何?

Set<Integer> s = new LinkedHashSet<>();
addToSet(1, s);
addToSet(2, s);
addToSet(3, s);
addToSet(1, s);
print(s);

void addToSet(Integer v, Set<Integer> s) {
    s.remove(v);
    s.add(v);
}

答案 2 :(得分:0)

使用LinkedHashSet代替Hashset来保持插入顺序。

Set<Integer> s = new LinkedHashSet<Integer>();

答案 3 :(得分:-1)

  1. 编写一个实现Map接口的新类。使用LinkedHashSet的组成。
  2. 执行添加,以便检查重复项,将其删除并读取。将其余接口方法直接映射到LinkedHashSet。
  3. 编写单元测试,并将您的代码提供给Codereview堆栈交换。

祝你好运。