创建一个不允许重复元素的队列,并且应该允许基于索引的检索

时间:2012-07-23 03:34:06

标签: java data-structures

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

4 个答案:

答案 0 :(得分:5)

很明显,Java没有与您的规范和要求相匹配的确切数据结构。最符合您要求的可能是LinkedHashSet。它基本上是一个Set(匹配您的唯一项目要求),其元素以插入顺序(如队列)保存,并且通过索引获取元素,您可以使用set.toArray()来获取数组或创建列表集合(但是它会花费一些额外的内存)。

答案 1 :(得分: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());
    }
}

答案 2 :(得分:0)

你总是可以使用ArrayList。它最适合访问基于索引的元素,添加元素时,您总是可以检查ArrayList是否包含要添加的元素。我最初的本能是使用Set来禁止重复,但元素是集合没有索引。如果你能找到一种方法来索引集合中的元素,那么这将是我的建议。

答案 3 :(得分:0)

不要将其称为队列,因为根据定义,队列只是先进先出数据结构。

根据您的输入值,我相信您应该使用数组和哈希函数。散列使​​用其值确定元素所在的索引,反之亦然,即当给定索引时,它返回其中包含的值。

由于您正在使用哈希,因此在发生冲突时可以避免重复,即您可以检查索引中是否存在先前存在的值以及它是否为相同值。

C ++ stl有一个很好的类设置虽然java我不认为有一个。但设定的点不提供基于索引的检索。