2011-04-22 33 views
1

我正在將文本文件讀取到二維數組中。第一列(我正在分類的那一列)幾乎都是雙打。正如你們大概知道的那樣,它可以排序1.1 1.6 25.6 6.4,我該如何解決這個問題?用雙倍數組對Java進行排序

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

public class Sort { 

    public static void main(final String[] args) throws FileNotFoundException { 
     FileOutputStream out = new FileOutputStream("/Users/evanlivingston/2d.txt"); 
     PrintStream pout = new PrintStream(out); 
     List<String[]> entries = new ArrayList<String[]>(); 
     Scanner sc = new Scanner(new File("/Users/evanlivingston/dists/0.txt")); 
     while (sc.hasNext()) { 
      entries.add(new String[] { sc.next(), sc.next()}); 
     } 
     String[][] table = entries.toArray(new String[0][]); 

     Arrays.sort(table, new Comparator<String[]>() { 
      @Override 
      public int compare(String[] s1, String[] s2) { 
       String t1 = s1[0]; 
       String t2 = s2[0]; 
       return t1.compareTo(t2);    
      }  
     }); 
     pout.print(java.util.Arrays.deepToString(table)); 
     pout.close(); 
    } 
} 

編輯
這是我更新的代碼。它不會編譯。

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

public class Sort { 
    public static void main(String[] args) throws FileNotFoundException { 
     FileOutputStream out = new FileOutputStream("/Users/evanlivingston/2d.txt"); 
     PrintStream pout = new PrintStream(out); 
     List<Coords> coords = new ArrayList<Coords>(); 
     { 
      Scanner sc = new Scanner(new File("/Users/evanlivingston/dists/0.txt")); 
      while(sc.hasNextLine()) { 
       String[] numstrs = sc.nextLine().split("\\s+"); 
      } 
      String[][] table = coords.toArray(new String[0][]); 

      Arrays.sort(table, new Comparator<Double[]>() { 
       @Override 
       public int compare(Double[] s1, Double[] s2) { 
        double a = Double.parseDouble(s1); 
        double b = Double.parseDouble(s2); 
        compare(a, b); 
       } 
      }); 
      pout.print(java.util.Arrays.deepToString(table)); 
      pout.close(); 
     } 
    } 
} 
+0

**差不多所有雙打?通過這裏的「Double」,我假設你的意思是「根據慣例,可以將其解釋爲浮點數,我希望根據浮點值進行排序,而不是按字典順序排列」。 – 2011-04-22 05:27:28

+0

@Karl Knecthel,是的,這正是我的意思,我編輯的代碼是我認爲是正確的,但它不會編譯。 – evanlivingston 2011-04-22 05:32:27

+1

這是很好,你正在編輯跟進,但請添加到原來的職位,而不是覆蓋。覆蓋刪除原始答案的上下文,使他們看起來不適合這個問題。 – Pops 2011-04-22 05:40:00

回答

1

你比較String值,而不是Double值,所以自帶2後1和6

爲了解決這個問題,你應該與包裝方法valueOf()你的價值觀轉化爲實際Double對象( documentation)。

編輯
我去上面的簡單修復,但如果你關心在所有關於性能camickr的回答是好。

關於您的更新沒有編譯,多個事情是錯誤的。你有沒有在任何地方聲明第二個compare()方法?這沒有什麼內置的。遞歸調用現有的compare()不會對您的情況有所幫助。

在該說明中,您不能調用現有的compare();自動裝箱將不會將原始的double s轉換爲Double對象的數組。並且沒有辦法將Double數組解析爲基元double

既然你想現在使用原始double S,你可以只使用普通的老><運營商,而不是更復雜的東西Comparator比較。

-1

讓您的比較器將其輸入的字符串轉換爲雙精度,並進行數字比較而不是字符串比較。

這就是Comparator概念的優勢。它可以對輸入做任何事情。因此,如果您需要將Strings分類爲數字,請填寫Comparator即可。

1

您正在比較字符串,而不是數字值。 1在詞彙上低於2,而2在詞彙上低於3。所以從字符串的角度來看,234小於3.您必須將doublesstrings轉換爲正確的比較。在Java中,你通過這樣做:

double aDouble = Double.parseDouble(aString);

所以你的最終表現確實應該

double a = Double.parseDouble(firstString); 
double b = Double.parseDouble(secondString); 
compare(a,b); 
+1

我剛剛對此表示贊同,但是原始'double'不具備使用'compareTo()'方法的能力。 – Pops 2011-04-22 03:16:23

+0

真的嗎? http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Double.html#compareTo(java.lang.Double) – acconrad 2011-04-22 03:20:51

+2

該鏈接適用於「Double」對象。你的代碼是一個「雙重」原語。你不能在基元上調用方法。 – camickr 2011-04-22 03:44:10

6

商店雙打數組中不是字符串。

因此,當您從文件中讀取字符串時,將字符串轉換爲雙精度字符串。或者使用Scanner.nextDouble()方法爲您做到這一點。

您不希望在每次調用比較器時轉換字符串。