Collection.sort没有返回预期的结果

时间:2017-09-11 03:41:33

标签: java mysql sorting

我试图用Java确定MySQL数据库中列的顺序。我有表的create语句(this.create)和列的名称(column.getName())。然后,我在create语句中找到列名的索引。我将这些值分配给List,然后,我使用Collectio.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

我做错了什么想法?非常感谢你的帮助!

2 个答案:

答案 0 :(得分: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数组中元素的顺序无关紧要,因为您所做的只是检查索引是否在该数组中的某个位置。您实际上是以order_of_columns中显示的顺序向columns添加内容。所以你没有重新排列任何内容,而你的sort也没用。

但是,如果您先通过cols,那么您将根据order_of_columns中的顺序添加到cols。因此,我认为如果你只是切换两个for,你就会得到你想要的答案。

但是,有更好的方法可以做到这一点。您的代码通过仅对整数进行排序,然后通过并确定哪些列对应于这些整数来完成大量重复工作 - 您已经完成的工作。更好的方法是创建一个具有ColumnAndIndexInteger的POJO类column,并将其设为Comparable类,其compareTo()只比较整数(这将是indexOf值。而不是List<Integer>,创建一个List<ColumnAndIndex>来存储column和索引。使用sort;这将对索引进行排序。现在只需查看结果,列就已存在 - 无需额外的工作。

答案 1 :(得分: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() );
    }
}