我想创建一个不允许重复元素的队列,我应该能够根据索引访问此队列的元素。请让我知道我应该如何实现这个?
答案 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我不认为有一个。但设定的点不提供基于索引的检索。