【问题标题】:Collection.sort Not Returning Expected ResultCollection.sort 未返回预期结果
【发布时间】:2018-02-19 05:35:40
【问题描述】:

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

对我做错了什么有任何想法吗?非常感谢您的帮助!

【问题讨论】:

  • 我认为你的 for 循环可能有问题。你可以试试:for ( column c : columns ) 而不是for ( column column : columns ) ?我不明白为什么 Java 编译器会编译它!
  • 你期待什么?
  • @cdaiga 因为这是合法的 Java。它为不同类型的标识符保留单独的名称空间。但是,约定是使用以大写开头的类名,因此column 作为类名不符合约定。
  • 我希望整数按升序排列。

标签: java mysql sorting


【解决方案1】:

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 值)。创建一个同时存储column 和索引的List&lt;ColumnAndIndex&gt;,而不是List&lt;Integer&gt;。在上面使用sort;这将对索引进行排序。现在只需检查结果,列就已经存在了——不需要额外的工作。

【讨论】:

  • 谢谢。颠倒 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() );
    }
}

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 2010-09-22
    • 2021-05-17
    • 2018-03-23
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多