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]