我的程序读取一个输入文件,该文件是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));
}
}
}
答案 0 :(得分:3)
为了简化您的代码而不需要以编程方式删除任何重复,您可以使用HashSet
,LinkedHashSet
或TreeSet
而不是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
然后您可以处置find
和removeDuplicates
。
请注意,在任何一种情况下,重复项都区分大小写 - 但这是您的代码目前所执行的操作。
答案 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;
}