如何从数据结构中获取和删除第一个元素?
How can I get and remove the first element from a data structure?
我需要使用可以 -
的数据结构
- 保持插入顺序。
- 不存储任何重复项。
- 而且我可以轻松地从中高效地获取和删除第一个元素。
下面是我的代码,它使用了 LinkedList 但它没有过滤掉任何重复项。它有 removeFirst()
方法获取和删除列表中的第一个元素。
public static LinkedList<String> getData(TypeEnum types) {
LinkedList<String> listOfPaths = new LinkedList<String>();
String prefix = types.equals(TypeEnum.PARTIAL) ? TypeEnum.PARTIAL.value() : TypeEnum.UNPARTIAL.value();
listOfPaths.add(prefix + LOCAL_PATH); // first element in the list is always LOCAL PATH
for (String path : REMOTE_PATH) {
listOfPaths.add(prefix + path);
}
return listOfPaths;
}
下面是我如何使用 getData
方法:
LinkedList<String> data = getData(types);
String local_path = data.removeFirst(); // this is my local path
// use local_path here
// now iterate all the remote path
for(String remotePath : data) {
// do something with remotePath
}
我这里有哪些有效的选项?是否有任何其他数据结构可以通过避免重复来做同样的事情。我知道 Set 可以做到这一点,但 Set 没有任何 removeFirst
方法,并且不确定在这里使用它是否是正确的结构。另外,谁也能举个例子。
这个答案是根据@copeg 的评论修正的,谢谢。
解决方案可能是通过执行以下操作来简单地扩展列表添加方法:
public class MyList<E> extends LinkedList<E> {
@Override
public boolean add(int index, E element){
if(this.contains(element))return false;
return super.add(index,element);
}
}
您可以使用 LinkedHashSet(维持插入顺序)。例如,首先将项目添加到此 Set
以过滤掉重复项,然后将所有项目添加到 LinkedList
:
public static LinkedList<String> getData(TypeEnum types) {
LinkedList<String> listOfPaths = new LinkedList<String>();
LinkedHashSet<String> uniques = new LinkedHashSet<String>();
String prefix = types.equals(TypeEnum.PARTIAL) ? TypeEnum.PARTIAL.value() : TypeEnum.UNPARTIAL.value();
uniques.add(prefix + LOCAL_PATH); // first element in the list is always LOCAL PATH
for (String path : REMOTE_PATH) {
uniques.add(prefix + path);
}
listOfPaths.addAll(uniques);
return listOfPaths;
}
我需要使用可以 -
的数据结构- 保持插入顺序。
- 不存储任何重复项。
- 而且我可以轻松地从中高效地获取和删除第一个元素。
下面是我的代码,它使用了 LinkedList 但它没有过滤掉任何重复项。它有 removeFirst()
方法获取和删除列表中的第一个元素。
public static LinkedList<String> getData(TypeEnum types) {
LinkedList<String> listOfPaths = new LinkedList<String>();
String prefix = types.equals(TypeEnum.PARTIAL) ? TypeEnum.PARTIAL.value() : TypeEnum.UNPARTIAL.value();
listOfPaths.add(prefix + LOCAL_PATH); // first element in the list is always LOCAL PATH
for (String path : REMOTE_PATH) {
listOfPaths.add(prefix + path);
}
return listOfPaths;
}
下面是我如何使用 getData
方法:
LinkedList<String> data = getData(types);
String local_path = data.removeFirst(); // this is my local path
// use local_path here
// now iterate all the remote path
for(String remotePath : data) {
// do something with remotePath
}
我这里有哪些有效的选项?是否有任何其他数据结构可以通过避免重复来做同样的事情。我知道 Set 可以做到这一点,但 Set 没有任何 removeFirst
方法,并且不确定在这里使用它是否是正确的结构。另外,谁也能举个例子。
这个答案是根据@copeg 的评论修正的,谢谢。
解决方案可能是通过执行以下操作来简单地扩展列表添加方法:
public class MyList<E> extends LinkedList<E> {
@Override
public boolean add(int index, E element){
if(this.contains(element))return false;
return super.add(index,element);
}
}
您可以使用 LinkedHashSet(维持插入顺序)。例如,首先将项目添加到此 Set
以过滤掉重复项,然后将所有项目添加到 LinkedList
:
public static LinkedList<String> getData(TypeEnum types) {
LinkedList<String> listOfPaths = new LinkedList<String>();
LinkedHashSet<String> uniques = new LinkedHashSet<String>();
String prefix = types.equals(TypeEnum.PARTIAL) ? TypeEnum.PARTIAL.value() : TypeEnum.UNPARTIAL.value();
uniques.add(prefix + LOCAL_PATH); // first element in the list is always LOCAL PATH
for (String path : REMOTE_PATH) {
uniques.add(prefix + path);
}
listOfPaths.addAll(uniques);
return listOfPaths;
}