我无法使用removeDuplicate方法工作?

时间:2014-03-26 15:47:40

标签: java arrays string duplicate-removal

我的程序读取一个输入文件,该文件是txt file,包含名字和姓氏的副本。我不确定为什么removeDuplicate方法不会删除重复项而是给我一个错误。我做错了什么?

public static void main(String[] args) throws IOException {

        ArrayList<String> names = new ArrayList<String>();

        String fName;
        String lName;

        System.out.println("What is the input file?");

        Scanner kb = new Scanner(System.in);
        String fileName = kb.next();

        File list = new File(fileName);

        Scanner in = new Scanner(list);

        System.out.println("What is the output file?");

        String outFileName = kb.next();

        PrintWriter outFile = new PrintWriter(outFileName);

        while (in.hasNext()) {

            fName = in.next();

            lName = in.next();

            names.add(fName + " " + lName);
            removeDuplicates(names);
            display(names);


            outFile.println(fName + " " + lName);

        }
        outFile.close();

    }
}

这是我公共主要

之外的方法
public class StudentList {

    public static void display(ArrayList<String> n) {
        // step through all positions of the ArrayList n and display the values
        // at each positoin
        for (int i = 0; i < n.size(); i = i + 1) {
            System.out.println(n.get(i));
        }
    }


    public static int find(ArrayList<String> names, int i) {

        String s = names.get(i);
        for (i = 0; i < names.size(); i = i + 1) {
            for (int j = i + 1; j < names.size(); j = j + 1) {
                if (s.equals(names.get(j))) {

                    return j;

                }
            }

        }
        return -1;
    }


    public static void removeDuplicates(ArrayList<String> names) {

        for (int i = 0; i < names.size(); i = i + 1) {
            while (find(names, i) > 0) {
                names.remove(find(names, i));
            }
        }

    }

2 个答案:

答案 0 :(得分:3)

为了简化您的代码而不需要以编程方式删除任何重复,您可以使用HashSetLinkedHashSetTreeSet而不是ArrayList

基本上是:

  • Set<String> names = new HashSet<String>(); // unordered, doesn't keep duplicates
  • Set<String> names = new LinkedHashSet<String>(); // keeps insertion order, doesn't keep duplicates
  • Set<String> names = new TreeSet<String>(); // ordered by lexicographic order, doesn't keep duplicates

然后您可以处置findremoveDuplicates

请注意,在任何一种情况下,重复项都区分大小写 - 但这是您的代码目前所执行的操作。

答案 1 :(得分:0)

每个人对使用Set的评论都是正确的。这是您应该使用的数据结构。但是,代码的问题在于find()方法。您传入int i并设置String s = names.get(i)然后执行嵌套for循环,但永远不会更改字符串。

试试这个:

public static int find(ArrayList<String> names) {


    for (i = 0; i < names.size(); i = i + 1) {
        String s = names.get(i);
        for (int j = i + 1; j < names.size(); j = j + 1) {
            if (s.equals(names.get(j))) {

                return j;

            }
        }

    }
    return -1;
}

请注意,您将s设置为for循环中的第i个元素。您不再需要方法中的参数I.但是,这可能会改变您的代码。如果你想简单地试图找到每次发生的事情,你会想要这个:

public ArrayList<Integer> find(String name, ArrayList<String> names) {
  ArrayList<Integer> duplicateIndices = new ArrayList<Integer>();
  for (int i = 0; i < names.size(); i++) {
    if (names.get(i).equals(name)) {
      duplicateIndices.add(new Integer(i));
    }
  }
  return duplicatIndices;
}