2017-09-11 131 views
1

我想確定Java數據庫中列的順序。我有表的create語句(this.create)和列的名稱(column.getName())。然後我在create語句中找到列名的索引。我將這些值分配給List,然後使用Collectio.sort()對它們進行排序。這用於確定列的順序。唯一的問題是我沒有得到預期的結果。這裏是我的代碼:Collection.sort沒有返回預期結果

public void orderColumns() { 

     List<Integer> cols = new ArrayList(); 
     for (column column : columns) { 

      cols.add(this.create.indexOf("`" + column.getName() + "`")); 
     } 

     Collections.sort(cols); 

     for (column column : columns) { 
      for (int i = 0; i < cols.size(); i++) { 
       if (this.create.indexOf("`" + column.getName() + "`") == cols.get(i)) { 
        this.order_of_columns.add(column); 
       } 
      } 
     } 
     System.out.println(this.create); 
     for(column column : order_of_columns) { 

      System.out.println(this.name + " : " + this.create.indexOf("`" + column.getName() + "`") + " " + column.getName()); 
     } 
    } 

這裏是輸出爲一個表:

CREATE TABLE `versions` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL DEFAULT '', 
    `version` varchar(10) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1; 
versions : 77 name 
versions : 119 version 
versions : 28 id 

什麼我做錯了任何想法?十分感謝你的幫助!

+0

我認爲這可能是一個問題,您的for循環。你可以嘗試:for(column c:columns)'而不是for for(column column:columns)'?我不明白爲什麼Java編譯器會編譯它! – cdaiga

+0

你期望什麼? –

+3

@cdaiga因爲這是合法的Java。它爲不同類型的標識符保留單獨的名稱空間。但是,約定是使用以大寫字母開頭的類名,所以'column'作爲類名不符合約定。 – ajb

回答

4

sort工作正常,但您實際上並沒有使用排序產生的順序。在sort後,這裏就是你要做的:

for (column column : columns) { 
     for (int i = 0; i < cols.size(); i++) { 
      if (this.create.indexOf("`" + column.getName() + "`") == cols.get(i)) { 
       this.order_of_columns.add(column); 
      } 
     } 
    } 

也就是說,你通過列在秩序。對於每一列,請通過cols來查看indexOf結果是否在cols陣列中。但爲此目的,cols數組中的元素順序無關緊要,因爲您所做的只是檢查索引是否位於該數組中的某個位置。您實際上是按照它們在columns中出現的順序向order_of_columns添加內容。所以你沒有重新安排任何東西,而你的sort是沒用的。

但是,如果您先通過cols,那麼您將基於cols中的訂單添加到order_of_columns。因此,我認爲,如果您只需切換兩個for,就會得到您想要的答案。

雖然有更好的方法來做到這一點。你的代碼通過對整數進行排序來完成許多重複工作,然後通過並找出哪些列與這些整數相對應 - 你已經完成的工作。更好的辦法是創建一個POJO類ColumnAndIndex,它具有一個Integer和一個column,並將其設置爲Comparable類,其compareTo()只比較整數(將爲indexOf值)。而不是List<Integer>,創建一個List<ColumnAndIndex>存儲column和索引。使用sort就可以了;這將對索引進行排序。現在只需查看結果,列將已經存在 - 不需要額外的工作。

+0

謝謝。顛倒for循環的順序做了訣竅。 –

2

嘗試這樣:

public void orderColumns() 
{ 
    Map<Integer, Column> cols = new SortedMap<>(); 
    for (Column column : columns) 
    { 
     cols.put(this.create.indexOf( "`" + column.getName() + "`"), column); 
    } 

    System.out.println(this.create); 
    for(Map.Entry<Integer, Column> entry : cols) 
    { 
     System.out.printf("%s: %d %s%n", this.name entry.getKey(), 
              entry.getValue().getName()); 
    } 
}