比较文件(困难的方法)



我马上就要忘记这个了。我想把4个文件相互比较一下。

它们分为两个文件夹。因此存在文件夹"A"和文件1-4并且存在作为文件夹"a"的副本的文件夹"B"。

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("Yon");
        }else{
            System.out.println("Sorry seems to be the hardest wordn");
        }
    }
}

上面的代码在args[0]中获得一个文件夹,遍历一个包含几个文件的目录,并打印整个路径+文件的大小。

我只想看看文件名是否相等!

我在两个文件夹中都有z.txt——它们是相等的(名称)。然后我把其中一个改成了z2.txt。现在,我检查了两者是否同名。但我没有得到正确的结果。

您在该代码中有几个问题。

一个简单的解决方案是将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);
}

在方法duplikat中,使用进行检查

a.contains(file.getName())

如果实际文件的名称已经在列表中

Amir,

"list"one_answers"list2"是在每次walk()调用中新创建的。

将这些变量从walk()方法中拖出来,使它们成为static final。一旦它们是全局的和静态的,列表的相同副本将可用于每个walk()调用。

谢谢,Talha Ahmed Khan

您可以使用我的以下工作代码。

打印输出示例:

dene-Copy.txt文件名重复于f: \TEMP_USERS\test\2\dene-Copy.txtf: \TEMP_USERS\test\dene-Copy.txtdene.txt文件名重复于f: \TEMP_USERS\test\1\dene.txtf: \TEMP_USERS\test\2\1\dene.txtf: \TEMP_USERS\test\2\dene.txtf: \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);
}
}

相关内容

  • 没有找到相关文章

最新更新