所以我知道流的基础是如何工作的。基本上我可以像这样在
中实现它inputStream = new FileReader("infinite.txt"); // or socket, whatever
int c;
while ((c = inputStream.read()) != -1) {
//something here
}
但这更像是一个理论问题,而不是编码问题。当他问这个问题时,面试官在寻找什么?我的意思是我可以使用一个ArrayList,每次字符串进入时都会使用.append,然后运行一个函数来对它进行排序....每次我追加后你都不能说永远结束所以如果你在一切之后就这样做了在ArrayList中。
我正在寻找聪明的解决方案,这是一个练习面试问题。
Hashtables,Trees?
编辑:记住Hashtable / Tree通常有一个更好的运行时,然后在常规数组上排序
非常感谢!
答案 0 :(得分:0)
看看这个,这是词汇排序的标准:https://en.wikipedia.org/wiki/Bucket_sort
答案 1 :(得分:0)
使用
private final ConcurrentSkipListSet<Event> eventsInCurrentWindow;
然后你可以对移动窗口进行排序
new Timer().scheduleAtFixedRate(
new TimerTask() {
@Override
public void run() {
System.out.println("new window");
getToElement().ifPresent(toElement -> {
NavigableSet<Event> buffer =
eventsInCurrentWindow.headSet(toElement, true);
System.out.println("start publishing: {}
",ZonedDateTime.now());
buffer.forEach(terminateOperation::accept);
eventsInCurrentWindow.removeAll(buffer);
}
);
}
},
5000
1000
);
在Event with Timestamp
中换行字符串,然后方法getToElement()
应该创建元素作为当前窗口的最后一个元素(第一个+ 1000毫秒)
答案 2 :(得分:-1)
根据问题的上下文,您可以使用优先级队列
如果您的“已排序”无限流只需要在轮询时输出已排序的数据,而不是在任何给定的实例上完全排序,那么优先级队列将起作用。在这种情况下,轮询意味着在执行此操作后拉出树的根并重新平衡树。
优先级队列(PQ)是二进制堆。它的图形表示看起来像二叉树。两个属性导入到优先级队列:它是平衡的(结构属性),并且每个节点的值小于(或大于)其子节点(堆顺序属性)。
PQ的优点在于其根元素是您要访问的下一个已排序项目。它的操作允许在删除根之后重新平衡PQ并保留堆顺序属性。将节点添加到PQ也会保留两个属性。
您可以将无限流中的内容添加到PQ中,并且在每次添加添加操作之后,您可以确定PQ的根是最小(或最大)的东西。但请记住,由于PQ本身没有排序,因此您无法像二叉搜索树那样进行搜索。
一些链接:
http://interactivepython.org/runestone/static/pythonds/Trees/PriorityQueueswithBinaryHeaps.html http://algs4.cs.princeton.edu/24pq/
只需在互联网上搜索优先级队列;你会发现很多信息。