使用Java高效地将排序后的ArrayList放入排序后的数据结构中,并查找小于x的数字量
我有一个已经排序的数组列表。我希望把它放在一个排序的数据结构中,这样我就可以很容易地找到小于指定数量的项目数 到目前为止,我是这样做的:使用Java高效地将排序后的ArrayList放入排序后的数据结构中,并查找小于x的数字量,java,sorting,data-structures,tree,Java,Sorting,Data Structures,Tree,我有一个已经排序的数组列表。我希望把它放在一个排序的数据结构中,这样我就可以很容易地找到小于指定数量的项目数 到目前为止,我是这样做的: TreeSet<Integer> sortedList = new TreeSet<>(myArrayList); // This is slow 所有这些看起来都非常低效。这主要是因为myArrayList已经排序,初始化树集的速度非常慢 请注意,数组列表非常大,查询数量非常少(大约10个)。如果您的myArrayList已排序且不
TreeSet<Integer> sortedList = new TreeSet<>(myArrayList); // This is slow
所有这些看起来都非常低效。这主要是因为myArrayList
已经排序,初始化树集的速度非常慢
请注意,数组列表非常大,查询数量非常少(大约10个)。如果您的
myArrayList
已排序且不包含重复项,则二进制搜索是您的朋友。使用Collections.binarySearch
。binarySearch
返回现有元素的索引(因此idx+1
元素较少或相等)或插入给定元素的插入点(因此-idx-1
是严格较少的元素数,没有相等的元素)
用法示例:
List<Integer> nums = Arrays.asList(1, 10, 23, 31, 50, 65, 71, 89, 100);
System.out.println(countLessOrEqual(nums, 50)); // 5
System.out.println(countLessOrEqual(nums, 51)); // 5
System.out.println(countLessOrEqual(nums, 49)); // 4
System.out.println(countLessOrEqual(nums, 0)); // 0
System.out.println(countLessOrEqual(nums, 300)); // 9
System.out.println(removeAdjacentDuplicates(
Arrays.asList(1, 10, 10, 23, 31, 50, 50, 50, 65, 71, 89, 100)));
// [1, 10, 23, 31, 50, 65, 71, 89, 100]
不幸的是,重复可能是一个问题。如果存在重复项,我该怎么办?@YahyaUddin,您可以使用
TreeSet
以静默方式删除重复项。所以你的解决方案不仅速度慢,而且不正确?不,我想删除重复项。但几秒钟后,我想我没有复制品
List<Integer> nums = Arrays.asList(1, 10, 23, 31, 50, 65, 71, 89, 100);
System.out.println(countLessOrEqual(nums, 50)); // 5
System.out.println(countLessOrEqual(nums, 51)); // 5
System.out.println(countLessOrEqual(nums, 49)); // 4
System.out.println(countLessOrEqual(nums, 0)); // 0
System.out.println(countLessOrEqual(nums, 300)); // 9
public static List<Integer> removeAdjacentDuplicates(List<Integer> input) {
List<Integer> result = new ArrayList<>();
Integer last = null;
for(int i=0; i<input.size(); i++) {
Integer cur = input.get(i);
if(i == 0 || !cur.equals(last))
result.add(cur);
last = cur;
}
return result;
}
System.out.println(removeAdjacentDuplicates(
Arrays.asList(1, 10, 10, 23, 31, 50, 50, 50, 65, 71, 89, 100)));
// [1, 10, 23, 31, 50, 65, 71, 89, 100]