我正要在这里忘掉这一点。我想比较4个文件。
它们分为2个文件夹。因此文件夹“A”包含文件1-4 并且有文件夹“B”,它是文件夹“A”的副本。
package Aufgabe2;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class FTWalker {
FTWalkerTWO two;
public static void main(String[] args) throws IOException {
new FTWalker().walk(args[0]);
}
void walk(String pathname) throws IOException {
File[] files = new File(pathname).listFiles();
List<Integer> list = new ArrayList<Integer>();
List<String> liste2 = new ArrayList<String>();
int i = 0;
if (files != null)
for (File file: files)
if (file.isDirectory())
walk(file.getCanonicalPath());
else{
// process(file.getCanonicalPath(), (int)file.length());
System.out.println(""+file.getName()); //gibt namen aus
list.add( (int) file.length());
liste2.add(file.getName());
i++;
duplikat(file,liste2);
}
// sortiert(list);
}
void process(String name, int length) {
System.out.printf("%-70s%9d%n", name, length);
}
void sortiert(List<Integer> a) {
Collections.sort(a);
for (int k = 0; k < a.size(); k++) {
System.out.print(a.get(k) + " ");
}
System.out.println("");
Comparator<Integer> comparator = Collections.<Integer> reverseOrder();
Collections.sort(a, comparator);
for (int k = 0; k < a.size(); k++) {
System.out.print(a.get(k) + " ");
}
}
public void duplikat(File file,List<String> a ){//stand vorher List<String> liste2 drin
//for(int i.)
if(file.getName().equals(a.get(i)){
System.out.println("Yo\n");
}else{
System.out.println("Sorry seems to be the hardest word\n");
}
}
}
上面的代码在args[0]
获取一个文件夹,遍历一个包含几个文件的目录,并打印整个路径+文件的大小。
我想要的只是查看文件名是否相同!
我在两个文件夹中都有z.txt - 它们是相同的(名字)。然后我将其中一个更改为z2.txt。现在,我检查了两个都有相同的名字。但是我没有得到正确的结果。
答案 0 :(得分:1)
您在该代码中遇到了几个问题。
一个天真的解决方案是用List替换Set,然后添加文件名和大小的组合。
其他解决方案是创建一个包含文件名和大小的对象。这将覆盖equals()和hashode()的实现,然后使用HashSet验证是否找到了此类型的文件。
编辑:
由于您只需要检查文件名而不受任何其他限制,您可以使用Set来存储文件名。当您浏览文件系统时,您只需要验证该组中的名称是否已准备就绪。此外,您需要存储已找到的文件名的数量。要处理这个问题,您可以使用HashMap,其中key是文件名,Value是金额。
if(nameMap.contains(file.getName()) {
Integer index = nameMap.getValue(file.getName()) + 1;
//rename file file.renameTo(new File(newPathWithIndex)));
} else {
nameMap.put(file.getName(), 0);
}
答案 1 :(得分:1)
在方法duplikat中,请检查
a.contains(file.getName())
如果实际文件的名称已经在列表中
答案 2 :(得分:0)
阿米尔,
每次walk()调用都会新创建'list'和'list2'。
将这些变量拖出walk()方法,并使它们成为静态final。一旦它们是全局的和静态的,每个walk()调用都可以使用相同的列表副本。
谢谢, 塔尔哈艾哈迈德汗
答案 3 :(得分:0)
您可以使用我的以下工作代码。
打印示例:
dene - Copy.txt filename duplicated at f:\TEMP_USERS\test\2\dene - Copy.txt f:\TEMP_USERS\test\dene - Copy.txt dene.txt filename duplicated at f:\TEMP_USERS\test\1\dene.txt f:\TEMP_USERS\test\2\1\dene.txt f:\TEMP_USERS\test\2\dene.txt f:\TEMP_USERS\test\dene.txt
package info.kod;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class DuplicateFilenameFinder {
private Map<String, File> uniqueFilenames;
private Map<String, List<File>> duplicateMap;
public DuplicateFilenameFinder() {
uniqueFilenames = new HashMap<String, File>();
duplicateMap = new HashMap<String, List<File>>();
}
private Map<String, List<File>> findDuplicateNames(String pathname) {
File[] files = new File(pathname).listFiles();
if (files == null) {
return null;
}
for (final File file : files) {
if (file.isDirectory() == true) {
findDuplicateNames(file.getAbsolutePath());
} else {
checkAndAddDuplicate(file);
}
}
return duplicateMap;
}
private void checkAndAddDuplicate(final File file) {
final String filename = file.getName();
if (uniqueFilenames.containsKey(filename) == false) {
uniqueFilenames.put(filename, file);
return;
}
List<File> dupFiles = duplicateMap.get(filename);
if (dupFiles == null) {
dupFiles = new ArrayList<File>();
dupFiles.add(uniqueFilenames.get(filename));
dupFiles.add(file);
duplicateMap.put(filename, dupFiles);
} else {
dupFiles.add(file);
}
}
private void printOutDuplicatedFiles(final Map<String, List<File>> duplicateMap) {
if ((duplicateMap == null) || (duplicateMap.size() < 1)) {
System.out.println("No duplicate filename found");
return;
}
final Set<Entry<String, List<File>>> entrySet = duplicateMap.entrySet();
for (final Entry<String, List<File>> entry : entrySet) {
System.out.println(entry.getKey() + " filename duplicated at ");
final List<File> fileList = entry.getValue();
for (File file : fileList) {
System.out.println(" " + file.getAbsolutePath());
}
}
}
public static void main(String[] args) {
final String pathname = args[0];
final DuplicateFilenameFinder dupFinder = new DuplicateFilenameFinder();
final Map<String, List<File>> duplicatedFiles = dupFinder.findDuplicateNames(pathname);
dupFinder.printOutDuplicatedFiles(duplicatedFiles);
}
}