Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > проблема с TreeSet


Автор: tarasrng 20.9.2011, 00:38
доброго время суток. пишу программу поиска одинаковых файлов в директории, вот код основного класса:

Код



package del;

import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
/**
 *
 * @author RNG
 */
public class calculate implements Comparator{
  
    simpleFile sf;
    TreeSet <simpleFile> sFiles  = new TreeSet(this);
    ArrayList   ss  = new ArrayList();
    
    public calculate (File dir) {
        addFile(dir);
        Iterator iter = sFiles.iterator();
        while (iter.hasNext()){
            sf = (simpleFile)iter.next();
            System.out.println(sf);
       }
    }
    void addFile(File dir) {
        try
        {   
        File[] flist = new File[dir.listFiles().length];
           

        flist=dir.listFiles();
        
        for (int i=0;i<flist.length;i++)
        {
           if (flist[i].isDirectory())
            { 
                addFile(flist[i]);
            }
            else
            {              
                if (i<(flist.length)-1)
                    try{
                    }
                    catch (Exception ex)
                    {
                    }
                sf = new simpleFile((int) flist[i].length(),flist[i].getAbsolutePath());
                sFiles.add(sf);
                ss.add(sf);       
            }
        }
        }
        catch (Exception e)
        {
            System.out.println(e);
        } 
    }
    private class simpleFile
{
        public int a;
        public String  b;
    simpleFile(int a, String b)
    {
        this.a=a;
        this.b=b;
    }
        @Override
    public String toString ()
    {
        return "size= "+a+" path= "+b;
    }
   
}
    public int compare (Object o1, Object o2){
        simpleFile f1 = (simpleFile)o1;
        simpleFile f2 = (simpleFile)o2;
        if (f1.a>f2.a)
            return 1;
        if (f1.a<f2.a)
            return -1;
        if (f1.a==f2.a)
            return 0;
        return 0;
    }
}


здесь addFile - рекурсивная, и записывает размер файла и путь к нему в сортированную коллекцию  TreeSet и простую ArrayList здесь
Код

 sf = new simpleFile((int) flist[i].length(),flist[i].getAbsolutePath());
                sFiles.add(sf);
                ss.add(sf);

 в результате у простой коллекции есть все файлы, а у сортированной нету файлов из подпапок. Проблема вроде где-то в компараторе. помогите, что не так?

Автор: Farmazon 20.9.2011, 06:35
что-то не вижу, чтобы simpleFile реализовывал интерфейс Comparable... Увидел.

Ты файлы по длине пути сравниваешь, это неправильно. Ясен пень у тебя часть дубликатов отброшена... 

Код

    public int compare (Object o1, Object o2){
        simpleFile f1 = (simpleFile)o1;
        simpleFile f2 = (simpleFile)o2;
        return f1.b.compareTo(f2.b);
    }


так попробуй

Автор: tarasrng 20.9.2011, 15:28
Farmazon, теперь все файлы добавляются, но сравнение происходит по переменной b(пути к файлу) а мне нужно по a (размеру файла). я хочу чтобы коллекция была сортирована по размеру файлов. потом я найду файлы одинакового размера, найду по пути, и сравню содержимое. 

Автор: LSD 20.9.2011, 15:37
Код

    public int compare (Object o1, Object o2){
        simpleFile f1 = (simpleFile)o1;
        simpleFile f2 = (simpleFile)o2;
        if (f1.a>f2.a)
            return 1;
        if (f1.a<f2.a)
            return -1;
        if (f1.a==f2.a)
            return f1.compareTo(f2.b);
    }

Автор: tarasrng 22.9.2011, 11:32
Спасибо, разобрался

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)