您可能需要考虑使用不同的数据结构(TreeSet
如果可能的话),因为插入仍然会导致所有尾随元素移动。您可以使用它Collections.binarySearch
来查找插入位置,它会返回:
返回: 搜索键的索引,如果它包含在列表中;否则,(-(插入点)- 1)。插入点定义为将键插入列表的点:第一个元素的索引大于键,如果列表中的所有元素都小于指定的键,则为 list.size()。请注意,这保证了当且仅当找到键时,返回值将 >= 0。
编辑:示例TreeMap
TreeMap<Integer, Integer> numbers = new TreeMap<>();
private void add(int n) {
if(numbers.containsKey(n))
numbers.put(n, numbers.get(n)+1);
else
numbers.put(n, 1);
}
private void remove(int n) {
if(numbers.containsKey(n)) {
int i = numbers.get(n);
if(i == 1)
numbers.remove(n);
else
numbers.put(n, i-1);
}
}
示例List
List<Integer> numbers = new ArrayList<>();
private void add(int n) {
int idx = Collections.binarySearch(numbers, n);
if(idx < 0) {
idx += 1;
idx *= -1;
}
numbers.add(idx, n);
}
private void remove(int n) {
numbers.remove(n);
}