Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java高效地将排序后的ArrayList放入排序后的数据结构中,并查找小于x的数字量_Java_Sorting_Data Structures_Tree - Fatal编程技术网

使用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]