4

我想创建一个不允许重复元素的队列,并且我应该能够根据索引访问该队列的元素。请让我知道我应该如何实施?

4

4 回答 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 回答