2017-09-11 130 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()); 
    } 
}