0

たとえば、input.txt ファイルを並べ替えて output.txt に保存したい。挿入ソート アルゴリズムを使用します。今私の問題:compareToメソッドが正しく機能していないようです(または、少なくとも私が望んでいる方法ではありません)。1より大きい整数を返すため、特に負の数の場合、アルゴリズムは実際にはそうではありません。皆さんがその問題で私を助けてくれることを願っています、ありがとう!

それは私のコードです:

import java.util.ArrayList;
import java.io.*;

class Isort
{
    public static void main(String[] args)
    {   
        if(args[0].equals("int"))
        {
            ArrayList<Integer> array = new ArrayList<Integer>();
            sort(array, args[1], args[2]);
        }
        else if(args[0].equals("float"))
        {
            ArrayList<Float> array = new ArrayList<Float>();
            sort(array, args[1], args[2]);
        }
        else if(args[0].equals("String"))
        {
            ArrayList<String> array = new ArrayList<String>();
            sort(array, args[1], args[2]);
        }
        else
        {
            //do nothing
        }
    }
    public static <T extends Comparable<T>> void sort(ArrayList<T> array, String input, String output)
    {   
        try
        {
            File file = new File(input);
            BufferedReader reader = new BufferedReader(new FileReader(file));       
            reader.mark((int)file.length() + 1); 
            int count = 0;          
            while(reader.readLine() != null)
            {
                count++;
            }
            reader.reset();
            for(int i = 0; i<count; i++)
            {
                array.add((T)(reader.readLine()));
            }
            reader.close();

            int j;
            T temp;
            for(int i = 1; i < array.size(); i++)
            {
                j = i;
                while(j > 0 && array.get(j-1).compareTo(array.get(j)) > 0)
                {
                    temp = array.get(j);
                    array.set(j,array.get(j-1));
                    array.set(j-1,temp);
                    j -= 1;
                    System.out.println(array);
                }
            }
            PrintWriter writer = new PrintWriter(output);
            for(int i = 0; i<array.size(); i++)
            {
                writer.write(String.valueOf(array.get(i)));
                writer.write(System.getProperty ("line.separator")); 
            }
            writer.flush();
            writer.close();
        }
        catch(FileNotFoundException e)
        {

        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
4

2 に答える 2

3

ジェネリックの使用に混乱していると思います。、およびのジェネリックArrayListsを作成しています。次に、テキスト行を読み取り、それを にキャストしようとしています。IntegerLongStringT

これは、型消去のために実行時に何もしません。上記のすべてのケース (int、long、string) で、 を渡してリストArrayList<Object>に追加Stringします。ファイルからを読み取ると、キャストは既に存在するにStringキャストする以外は何もしません。したがって、of が要件と一致しない限り、これは機能しません。ObjectStringcompareToStringintlong

コメントのお返しに…

それがポイントです。この場合、ジェネリックにキャストしTたり、実際にジェネリックを使用したりしても、必要なことは実行されません。すべての場合において、あなたは を読んで比較してStringいます。代わりに、3 つのメソッドが必要readIntreadLongありreadString、期待に基づいて適切なメソッドを呼び出す必要があります。1 つのオプションは、 のインターフェースを使用readNextValueし、状況に応じて適切な実装を渡すことです。

于 2013-05-29T10:40:59.127 に答える
0

「 Collections.sort(...)」メソッドで「 Comparator」クラスを使用することをお勧めします。ここで例を見つけることができます-> http://www.vogella.com/blog/2009/08/04/collections-sort-java/

于 2013-05-29T10:39:35.010 に答える