如何使用原始元素删除ArrayList中的重复值

时间:2017-11-03 05:58:59

标签: java sorting arraylist collections

假设我有一个ArrayList,它有到要处理的特定文件的路径。但是,如果文件夹中只有一个文件,则只能处理此文件。这就是我的意思:

我的ArrayList

<input type="checkbox" name="data[]" value="0"><span class="check">
<input type="checkbox" name="data[]" value="1" ><span class="check">

具有

jquery

假设我的第5个元素是

int main(int argc, char* argv[]) { // do initialize stuff bool run = true; SDL_Event evt; // game loop while (run) { // process OS events while(SDL_PollEvent(&evt) != 0) { switch (evt.type) { case SDL_QUIT: run = false; break; } } update(); render(); } // clean up SDL_Quit(); return 0; }

很明显,它是我的0元素的副本,因为这个文件夹中的文件根本不应该被删除。应从列表中删除 C:\ 123 \ 456 \ NameOfUniqueFolder0 。我不能在这里使用 SET ,因为它将“删除”副本,但文件夹的一个路径仍然存在,并且内部的文件获得了proccessed。

5 个答案:

答案 0 :(得分:2)

在这里使用散列图可能有意义。密钥可以是文件路径,如果密钥存在,则值将是文件发生的次数。像这样:

Map<String, Integer> map = new HashMap<>();
map.put("C:\123\456\NameOfUniqueFolder0", 1);
map.put("C:\123\456\NameOfUniqueFolder1", 1);
map.put("C:\123\456\NameOfUniqueFolder2", 1);
map.put("C:\123\456\NameOfUniqueFolder3", 1);
map.put("C:\123\456\NameOfUniqueFolder4", 1);

现在当一条新路径出现时,增加其计数器:

String newPath = "C:\123\456\NameOfUniqueFolder0";
Integer val = map.get(newPath);
    map.put(newPath, val == null ? 1 : val.intValue() + 1);
}

最后,您可以迭代此地图,并检查每个键的计数器值。然后,您只需处理仅发生过一次的文件:

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    int count = entry.getValue();
    if (count == 1) {
        // process this file
    }
    // otherwise skip this path
}

答案 1 :(得分:2)

您可以这样做:

public class RemoveDuplicatesFromList {

    public static void main(String[] args) {
            List<String> originalList = new ArrayList<String>();
            //add your strings to list here
            Set<String> duplicateValues = new HashSet<String>();
            for(String str:originalList){
                //if firstIndex != lastIndex duplicate is present
                if(originalList.indexOf(str)!=originalList.lastIndexOf(str))
                    duplicateValues.add(str);

            }
            //remove duplicates from original list
            originalList.removeAll(duplicateValues);
            System.out.println(originalList);
    }

}

答案 2 :(得分:0)

您可以执行以下操作。它会给你带有它的出现次数的路径图。例如:{C:\123\456\NameOfUniqueFolder0=2, C:\123\456\NameOfUniqueFolder1=1}

Map<String, Long> collect = pathsToTheFile.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

在此之后,您只能处理发生次数等于1的路径。

答案 3 :(得分:0)

如果您希望按排序顺序使用TreeSet

,则只能使用HashSet
HashSet<String> set=new HashSet<String>();  
  set.add("C:\123\456\NameOfUniqueFolder0");  
  set.add("C:\123\456\NameOfUniqueFolder1");  
  set.add("C:\123\456\NameOfUniqueFolder2");  
  set.add("C:\123\456\NameOfUniqueFolder3");  
  set.add("C:\123\456\NameOfUniqueFolder4");  
  set.add("C:\123\456\NameOfUniqueFolder0");  
  //Traversing elements  
  Iterator<String> itr=set.iterator();  
  while(itr.hasNext()){  
   System.out.println(itr.next());  
  }  

您的输出将是

C:\ 123 \ 456 \ NameOfUniqueFolder0

C:\ 123 \ 456 \ NameOfUniqueFolder1

C:\ 123 \ 456 \ NameOfUniqueFolder2

C:\ 123 \ 456 \ NameOfUniqueFolder3

C:\ 123 \ 456 \ NameOfUniqueFolder4

答案 4 :(得分:0)

您可以尝试此代码

List<String> pathsToTheFile = new ArrayList<String>();
pathsToTheFile.add("C:/123/456/NameOfUniqueFolder0");
pathsToTheFile.add("C:/123/456/NameOfUniqueFolder1");
pathsToTheFile.add("C:/123/456/NameOfUniqueFolder2");
pathsToTheFile.add("C:/123/456/NameOfUniqueFolder0");
pathsToTheFile.add("C:/123/456/NameOfUniqueFolder3");
pathsToTheFile.add("C:/123/456/NameOfUniqueFolder4");
pathsToTheFile.add("C:/123/456/NameOfUniqueFolder0");
pathsToTheFile.add("C:/123/456/NameOfUniqueFolder0");

String newPathToBeAdded = "C:/123/456/NameOfUniqueFolder0";

while(pathsToTheFile.contains(newPathToBeAdded)) {  // the new path to be added
    pathsToTheFile.remove(newPathToBeAdded);
}
System.out.println(pathsToTheFile);