2017-09-11 1 views
1

Java 데이터베이스에서 MySQL 데이터베이스의 열 순서를 확인하려고합니다. 나는 테이블의 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 column : columns)'대신'for (column c : columns)'를 시도해 주시겠습니까? 자바 컴파일러가 왜 컴파일 될지 이해할 수 없다. – 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에 추가됩니다. 따라서 두 개의 스위치를 바꾸면 원하는 답변을 얻을 수 있다고 생각합니다.

이렇게하는 것이 더 좋은 방법입니다. 귀하의 코드는 정수 만 정렬 한 다음 그 정수에 해당하는 열 (이미 수행 한 작업)을 검토하고 처리함으로써 많은 중복 작업을 수행합니다. Integercolumn 인 POJO 클래스 ColumnAndIndex을 만들고이 compareTo()indexOf 값이 될만한 인 클래스를 Comparable 클래스로 만드는 것이 더 좋습니다. List<Integer> 대신 column 및 색인을 모두 저장하는 List<ColumnAndIndex>을 작성하십시오. 그것에 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()); 
    } 
} 
관련 문제