我正在尝试创建一个程序,它将搜索文件数组并将唯一的文件名存储到新的文件数组中并返回该新数组,只将重复项放入一次(如果有的话)。我的代码运行,但不会将值存储到我创建的新文件数组中,该文件数组没有设置长度。它只在我调用它时返回一个空数组。我设置它的方式是检查是否有任何重复,如果是,它存储重复一次,如果不是它只存储值并继续。问题是,一旦运行了for循环,它就不会存储这些值。有没有更好的方法在文件数组中存储值?
这是我的方法uniqueFile
,它从我的测试器块接收文件数组。
public static File[] getUnique(File[] files) {
int count = 0, place = 0;
File[] newFile = new File[] {};
for (int i = 0; i < files.length; i++) {
count = 0;
for (int x = 1; x < files.length; x++) {
if (files[i].equals(files[x]))
count++;
}
try {
if (count >= 1)
newFile[place] = files[i];
else
newFile[place] = files[i];
} catch (Exception e) {
}
place++;
}
return newFile;
}
这是我的测试人员:
{
File Freckle = new File("Freckle");
File Pickle = new File("Pickle");
File Sam = new File("Sam");
File Cat = new File("Cat");
File[] files = new File[] { Freckle, Pickle, Freckle, Sam, Cat,
Pickle };
File[] output = ArrayExercises.getUnique(files);
System.out.println(Arrays.toString(output));
}
我输入了通用文件名来测试它是否可行。最终我将合并实际文件,但我希望在继续之前先弄清楚这个错误。
答案 0 :(得分:3)
你自己很难做事。让Java为您完成所有工作。尝试使用LinkedHashSet,因为它为您提供唯一性,并且还保留了插入顺序。它也比将每个值与每个其他值进行比较更有效。
File [] input = {Freckle, Pickle, Freckle, Sam, Cat, Pickle};
Set<File> tmp = new LinkedHashSet<File>();
for (File each : input) {
tmp.add(each);
}
File [] unique = new File[tmp.size()];
int i = 0;
for (File each : tmp) {
unique[i++] = each;
}
System.out.println(Arrays.toString(unique));
答案 1 :(得分:0)
正如其他人所说,你应该使用Java Collections API,它会让生活变得更加容易。但是,我们暂时说你想让你的解决方案发挥作用。
问题是你的新数组是零长度,在这里你有一段非常奇怪的代码。 if (count >= 1)
newFile[place] = files[i];
else
newFile[place] = files[i];
测试没有意义,无论计数值如何,你都做同样的事情。在向数组添加非重复字符串时,还需要增加place
。 try / catch也没有意义。捕获一般异常是不好的做法。
你现在更喜欢下面的内容,但即使这样也赢了; t确实想要你想要的,虽然数组现在只包含唯一的条目,它的长度和以前一样长。
public static File[] getUnique(File[] files) {
place = 0;
File[] newFile = new File[files.size()]; //you were creating an empty array.
for (int i = 0; i < files.length; i++) {
boolean duplicate = false; // not interested in ho many dupes, just if there is one.
for (int x = 1; x < files.length; x++) {
if (files[i].equals(files[x])) {
duplicate = true;
break; // no point in checking the rest.
}
}
// why on earth did you have a try catch?
if (!duplicate) {
newFile[place++] = files[i];
}
}
return newFile;
}
你真正需要做的就是抛弃它,然后像另一张海报所说的那样使用像LinkedHashMap
这样的东西重新开始,否则你就会陷入低效的代码束缚中。</ p>