compareTo无法正常工作

时间:2013-05-29 10:32:56

标签: java compareto

我想对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();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

我相信你对仿制药的使用感到困惑。您正在制作ArrayListsIntegerLong的通用String。然后,您正在阅读一行文本并尝试将其强制转换为T

由于类型擦除,这在运行时不会执行任何操作。在上面的所有情况(int,long和string)中,您将传递ArrayList<Object>并将String添加到列表中。当您从文件中读取String时,强制转换不会执行任何操作,除非将其强制转换为Object String。因此,除非compareTo的{​​{1}}符合您对Stringint的要求,否则这将无效。

回复评论......

这就是重点。在这种情况下,转换为long或完全使用泛型不能满足您的需求。在所有情况下,您正在阅读并比较T。相反,您需要有三种方法StringreadIntreadLong,并根据您的期望调用相应的方法。一种选择是使用readString的接口,并根据情况传递适当的实现。

答案 1 :(得分:0)

我建议您在“ Collections.sort(...)”方法中使用“比较器”类。你可以在这里找到一个例子 - &gt; http://www.vogella.com/blog/2009/08/04/collections-sort-java/