我试图用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
我做错了什么想法?非常感谢你的帮助!
答案 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
,你就会得到你想要的答案。
但是,有更好的方法可以做到这一点。您的代码通过仅对整数进行排序,然后通过并确定哪些列对应于这些整数来完成大量重复工作 - 您已经完成的工作。更好的方法是创建一个具有ColumnAndIndex
和Integer
的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() );
}
}