Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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 连续数据流的排序算法_Java_Algorithm_Sorting_Continuous - Fatal编程技术网

Java 连续数据流的排序算法

Java 连续数据流的排序算法,java,algorithm,sorting,continuous,Java,Algorithm,Sorting,Continuous,堆排序、快速排序和合并排序哪种排序算法可以处理连续的数据流?我想要一个总是排序的列表,这样新的值就可以立即进入列表中的正确位置。我似乎找不到始终维护排序列表和拥有连续数据流的具体细节 类流分类器{ //一个[]排序的列表; //其他字段和初始化器:TODO 公共无效添加新元素(A x){ //将新元素添加到迄今为止收到的数据中,并创建一个排序列表。 } } 如何实现这个类,以便每次调用add_new_元素时,排序的_列表包含到目前为止所有排序的元素 对不起,如果这是一个愚蠢的问题,相信我,我已

堆排序、快速排序和合并排序哪种排序算法可以处理连续的数据流?我想要一个总是排序的列表,这样新的值就可以立即进入列表中的正确位置。我似乎找不到始终维护排序列表和拥有连续数据流的具体细节

类流分类器{
//一个[]排序的列表;
//其他字段和初始化器:TODO
公共无效添加新元素(A x){
//将新元素添加到迄今为止收到的数据中,并创建一个排序列表。
}
}
如何实现这个类,以便每次调用add_new_元素时,排序的_列表包含到目前为止所有排序的元素

对不起,如果这是一个愚蠢的问题,相信我,我已经尽我所能地寻找了


干杯

所以,问题是这实际上是行不通的。在任何时候,一个新的最低元素都可能出现,它必须直接进入开始,因此当更多的元素仍在出现时,您无法开始查看排序列表。但是堆就是你想要的:你可以向堆中添加更多的元素,你可以通过自己的方式,去掉迄今为止看到的最低元素。

自从你说,
我想要一个总是排序的列表,使用a或a。
TreeSet
实现了
Set
接口,因此不允许重复值

请注意,插入的元素必须具有自然顺序,即实现,或者您必须提供

有关排序数据结构的更多信息,请参阅下面关于stackoverflow的内容。

您可以使用维护排序集,如果需要,可以使用将其包装在线程安全的包装器中

java.util.SortedSet s=java.util.Collections.synchronizedSortedSet(新java.util.TreeSet(新java.util.Comparator)(){
@凌驾
公共整数比较(最终EO1,最终EO2){
//添加排序条件。
返回0;
}
}));

如果我理解正确-您希望您的元素以动态排序的顺序存储在in-momory集合中,而不是在所有元素都添加到集合时按逻辑点排序

如果这是正确的理解-您正在寻找SortedSet的实现-其中一个例子就是TreeSet

请注意,您的元素需要具有可比性。当然,限制是在内存利用率方面——考虑到您正在进行流式处理的事实,您可能有相对较大的数据负载

又快又脏的例子

package com.mytrial;

import java.util.Set;
import java.util.TreeSet;


public class StreamSorterExample {

    private static class MyDataFromStream implements Comparable<MyDataFromStream> {
        int someWeight;

        public MyDataFromStream(int someWeight) {
            this.someWeight = someWeight;
        }

        @Override
        public String toString() {
            return Integer.toString(someWeight);
        }

        @Override
        public int compareTo(MyDataFromStream that) {
            return this.someWeight - that.someWeight;
        }
    };

    public static void main(String[] args) {
        Set<MyDataFromStream> streamedData = new TreeSet<MyDataFromStream>();

        streamedData.add(new MyDataFromStream(10));
        streamedData.add(new MyDataFromStream(3));
        streamedData.add(new MyDataFromStream(5));

        System.out.println(streamedData);

        streamedData.add(new MyDataFromStream(111));
        streamedData.add(new MyDataFromStream(-1));

        System.out.println(streamedData);
    };
};

你能澄清连续的数据流吗?如果这意味着它正在进行,那么你就不能真正地对它进行排序,因为排序算法在有限的列表上工作。你可以把它分块分类,但我不认为这是你要问的。或者,如果您正在接收一个输入流,并对迄今为止看到的所有内容进行排序,那么插入排序将是合适的。与其将排序算法与顺序无关的数据结构相结合,为什么不寻找一个使其元素保持排序的数据结构呢?类似于树形图/树形集合或类似的。您也可以编写自己的
List
子类,覆盖
add()
/
insert()
方法,并在每次调用后重新排序。请参阅。您可以将对象放入其中,无论何时取出它们,它们都将按排序顺序显示出来。顺便说一句,在Java中,方法名称中没有下划线(通常)。惯例是使用camel case,就像在
addNewElement
中一样,更好的选择是
add
package com.mytrial;

import java.util.Set;
import java.util.TreeSet;


public class StreamSorterExample {

    private static class MyDataFromStream implements Comparable<MyDataFromStream> {
        int someWeight;

        public MyDataFromStream(int someWeight) {
            this.someWeight = someWeight;
        }

        @Override
        public String toString() {
            return Integer.toString(someWeight);
        }

        @Override
        public int compareTo(MyDataFromStream that) {
            return this.someWeight - that.someWeight;
        }
    };

    public static void main(String[] args) {
        Set<MyDataFromStream> streamedData = new TreeSet<MyDataFromStream>();

        streamedData.add(new MyDataFromStream(10));
        streamedData.add(new MyDataFromStream(3));
        streamedData.add(new MyDataFromStream(5));

        System.out.println(streamedData);

        streamedData.add(new MyDataFromStream(111));
        streamedData.add(new MyDataFromStream(-1));

        System.out.println(streamedData);
    };
};
[3, 5, 10]
[-1, 3, 5, 10, 111]