【问题标题】:delete duplicates in java arraylist删除java arraylist中的重复项
【发布时间】:2012-08-25 04:11:34
【问题描述】:

谢谢马尔科。我重写代码。尽量让它简单。这次真的可以编译了。但它只能删除相邻的重复项目。例如,如果我输入 1 2 3 3 4 4 5 1 - 输出为 1 2 3 4 5 1。它不能在最后提取副本。 (顺便说一句:这个网站的新手,如果让任何显示混乱我道歉)

这是新代码:

import java.util.*;

public class SetListDemo{
public static void main(String[] args){
    SetListType newList = new SetListType();
    Scanner keyboard = new Scanner(System.in);

    System.out.println( "Enter a series of items: ");
        String input = keyboard.nextLine();

    String[] original = input.split(" ");
    for (String s : original)
    newList.insert(s);

    List<String> finalList = new ArrayList(Arrays.asList(original)) ;

    Iterator<String> setIterator = finalList.iterator();  

    String position = null;

    while(setIterator.hasNext()){
        String secondItem = setIterator.next();

        if(secondItem.equals(position)){
            setIterator.remove();
        }   

        position = secondItem;
    }

    System.out.println("\nHere is the set list:");
    displayList(finalList);
    System.out.println("\n");
}

public static void displayList(List list){
    for(int index = 0; index <list.size(); index++)
    System.out.print(list.get(index) + ", ");
}

}

【问题讨论】:

  • SetListType 不是 Java 的内置类。这是您自己编写的课程还是您使用了错误的课程?
  • 当您问这样的问题时,请帮助我们更多地了解您的代码,SetListType 是什么以及它来自哪里?
  • 首先感谢所有cmets。
  • 请查看我编辑的答案,我添加了一个代码示例来展示它是如何完成的。您的代码的问题是,您仅将一个项目与下一个项目 (secondItem = iterator.next()) 与列表中的所有元素进行比较。因此,第一个 1 仅与 2 进行比较,而不是与以下所有项目进行比较。 List#contains() 方法基本上完全符合您通过迭代和比较尝试实现的功能。
  • 感谢 Ridcully 将进行试用。

标签: java arraylist iterator


【解决方案1】:

SetListIterator 是您的代码间接引用的类,但它不在类路径中。设置项目时,除了 SetListType 之外,您忘记复制该源文件,或者您可能是在 IDE 之外编译它,并且根本无法编译该类。

【讨论】:

  • 谢谢马尔科。我重写代码。尽量让它简单。这次真的可以编译了。但它只能删除相邻的重复项目。例如,如果我输入 1 2 3 3 4 4 5 1 - 输出为 1 2 3 4 5 1。它无法提取重复项
【解决方案2】:

从您所说的看来,当您运行作业时,您没有正确设置类路径,以便它包含已编译的 SetListType 类文件。您应该可以通过在运行 main 方法时设置 -classpath 选项来解决此问题,以指向此以及您的作业所依赖的任何其他类。

【讨论】:

    【解决方案3】:

    回答“删除java arraylist中的重复项”的问题:

    只需将所有元素放入 Set 即可。

    -或-

    迭代您的original 列表并将元素添加到List,但在添加它们之前,请检查List#contains() 是否已经存在该元素。

    编辑:试试这个:

    String[] original = input.split(" ");
    List<String> finalList = new ArrayList<String>();
    
    for (String s : original) {
        if (!finalList.contains(s)) {
            finalList.add(s);
        }
    }
    
    System.out.println("\nHere is the set list:");
    displayList(finalList);
    System.out.println("\n");
    

    【讨论】:

    • "迭代您的原始列表并将元素添加到列表中,但在添加它们之前,请使用 List#contains() 检查元素是否已经存在。"是的,这对我来说真的很震惊。我只是一直在想删除,删除。事实上,我可以将独特的项目删除到新列表中。谢谢。希望我能赶上到期日
    【解决方案4】:

    您可以使用 Vector 或 ListArray 并在添加之前检查该元素是否存在于新列表中。

    只是一个例子:

        Vector<String> list = new Vector<String>();
        System.out.println("list:");
        for(int i=0; i<100; i++){
            list.add("" + new Random().nextInt(10));
            System.out.println(list.lastElement());
        }
    
        System.out.println("newList:");
        java.util.Iterator<String> it = list.iterator();
        Vector<String> newList = new Vector<String>();
        while(it.hasNext()){
            String s = it.next();
            if(!newList.contains(s)){
                newList.add(s);
            }
        }
    
        for(String s : newList){
            System.out.println(s);
        }
    

    第二部分:

        int[] count = new int[newList.size()];      
        for(String s : list){
            int index = newList.indexOf(s);
            count[index]++;
        }
    
        for(String s : newList){
            System.out.println(s + " appears " + count[newList.indexOf(s)] + " times");
        }
    

    【讨论】:

    • 首先感谢所有 cmets。是的 SetListType 是我写的另一个类。它包含8个方法:void insert()、E erase(E target)、int count(E target)将用于计算原始列表中元素的出现次数、void clear()、boolean is Empty()、int capacity (), int size(), E get(int index); E 删除(整数索引)。我们必须使用所有这些来制定程序。试图在 语句之前放置一个 for 循环。但得到了非法启动异常。
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2018-05-29
    • 2014-04-22
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多