Сравнение файлов (трудный путь) - PullRequest
0 голосов
/ 01 июня 2011

Я собираюсь сойти с ума по этому вопросу прямо здесь. Я бы хотел сравнить 4 файла друг с другом.

Они разделены на 2 папки. Итак, есть папка «А» с файлом 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. Теперь я проверил, оба имеют одинаковое имя или нет. Но я не получаю правильный результат.

Ответы [ 4 ]

1 голос
/ 01 июня 2011

В методе дупликат, проверьте с помощью

a.contains(file.getName())

, если фактическое имя файла уже есть в списке

1 голос
/ 01 июня 2011

У вас есть несколько проблем в этом коде.

Наивное решение состоит в том, чтобы заменить Список на Набор , а затем добавить к нему комбинацию имени файла и размера.

Другим решением является создание объекта, который будет содержать имя файла и его размер.Это переопределит реализацию equals () и hashode () , а затем использует HashSet , чтобы проверить, что файл этого типа был найден.

РЕДАКТИРОВАТЬ:

Поскольку вам нужно только проверить имя файла без каких-либо других ограничений, единственное, что вы могли бы использовать Set, где вы можете сохранить имя файла.Когда вы проходите через файловую систему, вам просто нужно убедиться, что такое имя все готово в наборе.Кроме того, вам нужно хранить количество уже найденных имен файлов.Для этого вы можете использовать HashMap, где ключ - это имя файла, а значение - это сумма.

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);
}
0 голосов
/ 01 июня 2011

Вы можете использовать мой следующий рабочий код.

Пример распечатки:

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);
}

}
0 голосов
/ 01 июня 2011

Amir,

'list' и 'list2' создаются заново при каждом вызове walk ().

Перетащите эти переменные из метода walk () и сделайте их статическими окончательными. Как только они будут глобальными и статичными, одна и та же копия списка будет доступна для каждого вызова walk ().

Спасибо, Талха Ахмед Хан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...