2013-05-29 30 views
0

我想对input.txt文件进行排序并将其保存在output.txt中。我使用插入排序算法。现在我的问题:compareTo方法似乎工作不正确(或至少不是我想如何工作)。它返回大于1的整数,因此该算法对于负数不是特别重要。我希望你们能帮助我解决这个问题,谢谢!compareTo无法正常工作

那是我的代码:

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(); 
     } 
    } 
} 
+3

你有什么证据表明'compareTo'不工作?换句话说,证明问题的最小测试用例是什么? –

+0

覆写compareto? –

+0

我很确定compareTo对于Integer,Float和String正常工作。比较负数时您期望的行为是什么? – nitegazer2003

回答

3

我相信你对泛型的使用感到困惑。您正在制作IntegerLongString的通用ArrayLists。然后,您正在阅读一行文字并尝试将其投射到T

由于类型擦除,这在运行时不会做任何事情。在上述所有情况下(int,long和string),您将传递一个ArrayList<Object>并将String添加到列表中。当你从档案中读取String时,剧组除了将其投射到Object已经是String之外什么都不做。所以除非compareToString符合您的要求intlong这是行不通的。

在回复评论...

这就是要点。在这种情况下铸造到T或真的使用泛型不会做你需要的。在所有情况下,您正在阅读并比较String。相反,您需要有三种方法readInt,readLongreadString,并根据您的期望调用适当的方法。一种选择是使用接口readNextValue并根据情况通过适当的实施。

+0

我将它转换为'T',否则我不能编译它。我宁愿使用像T.valueOf(reader.readline())这样的东西,但这是不可能的。 如果我只会使用int或long,算法也无法工作。例如:输入:-1,-10输出:-1,-10(而不是-10,-1) – j0kR

+0

请参阅回复更新 –