我想创建一个不允许重复元素的队列,并且我应该能够根据索引访问该队列的元素。请让我知道我应该如何实施?
问问题
11546 次
4 回答
5
很明显,Java 没有符合您的规范和要求的确切数据结构。最接近您的要求的可能是LinkedHashSet。它基本上是一个集合(符合您的独特项目要求),其元素按插入顺序保存(如队列)并通过索引获取元素,您可以使用它set.toArray()
来获取数组或从集合中创建列表(但是它将花费一些额外的内存)。
于 2012-07-23T03:54:03.470 回答
1
我打算使用ConcurrentLinkedQueue来解决我的问题。这是示例代码
import java.util.concurrent.ConcurrentLinkedQueue;
public class FinalQueue {
private ConcurrentLinkedQueue<String> queue;
public FinalQueue()
{
queue = new ConcurrentLinkedQueue<String>();
}
public synchronized void enqueue(String ipAddress)
{
if(!queue.contains(ipAddress))
queue.add(ipAddress);
}
public String dequeue()
{
return queue.poll();
}
public String toString()
{
return "" + queue;
}
/**
* @param args
*/
public static void main(String[] args) {
FinalQueue queue = new FinalQueue();
queue.enqueue("1.2.3.4");
queue.enqueue("2.3.4.5");
queue.enqueue("1.1.1.1");
queue.enqueue("1.2.3.4");
System.out.println(queue.toString());
System.out.println("Dequeue..." + queue.dequeue());
System.out.println("Dequeue..." + queue.dequeue());
System.out.println(queue.toString());
}
}
于 2012-07-27T03:44:45.090 回答
0
你总是可以只使用一个 ArrayList。它非常适合基于索引访问元素,并且在添加元素时,您始终可以检查 ArrayList 是否包含要添加的元素。我最初的直觉是使用 Set 来禁止重复,但元素是 Set 没有索引。如果您能找到一种方法来索引 Sets 中的元素,那么这将是我的建议。
于 2012-07-23T03:37:19.783 回答
0
不要称它为队列,因为根据定义,队列只是先进先出的数据结构。
根据您的输入值,我相信您应该使用数组和哈希函数。散列使用其值确定元素位于哪个索引,反之亦然,即当给定索引时,它返回包含在其中的值。
由于您使用的是散列,因此在发生冲突时可以避免重复,即您可以检查索引中是否存在先前的值以及它是否是相同的值。
C++ stl 有一个很好的 set 类,尽管我认为 java 没有。但是设置点不提供基于索引的检索。
于 2012-07-23T10:21:13.637 回答