2011-11-13 2 views
1

정렬 속도를 높이기 위해 색인 된 여러 행의 행렬을 가질 수 있는지 알고 싶었습니다. MySQL에서는 여러 열에 대해 색인을 생성 할 수 있으므로 테이블에서 요소를 빠르게 찾을 수 있지만 표준 Java 행렬에서 가능한지 여부는 알 수 없습니다. 예를 들어, 내 데이터는 ID, 이름 및 성을 가진 3 열 매트릭스이며이 테이블에 많은 항목이 있습니다. 지금 나는 mat [5]와 같은 것을 말할 수 있고 id가 5 인 개인에 대한 엔트리를 얻을 수 있습니다. 그러나 last name 컬럼으로 엔트리를 검색 할 수 있기를 원합니다. Java에서이 작업을 가장 효율적으로 수행하려면 어떻게해야합니까?자바 행렬 색인하기

답변

3

Java 인 경우 마지막 행렬의 행렬 인덱스에 행을 연결하는 해시 테이블을 설정할 수 있습니다. 이렇게하면 해당 행의 사용자가 성을 갖게됩니다.

또는 m[index.get(lastName).get(firstName)]과 같이 여러 수준의 해시 테이블을 만들 수 있습니다.

또한 이름을 사전 식 순서로 반복하려면 해시 테이블을 TreeMap으로 바꿀 수 있습니다.

예 :

import java.util.*; 
class Test{ 
    public static void main(String[]args){ 

     Object[][] m = new Object[][]{ 
      {1, "Smith", "John"}, 
      {2, "Stone", "Jack"}, 
      {3, "Stein", "Robert"}, 
      {4, "Stone", "Bob"} 
     }; 

     //index.get(lastName) will return a map between 
     //first names and matrix row indices. 
     //index.get(lastName).get(firstName) returns the index 
     //in the matrix of the row pertaining to person (lastName, firstName) 
     TreeMap<String, TreeMap<String, Integer>> index = 
      new TreeMap<String, TreeMap<String, Integer>>(); 

     //create index 
     for(int i=0;i<m.length;i++){ 
      Object[]o = m[i]; 
      String last = o[1].toString(); 
      String first = o[2].toString(); 
      TreeMap<String,Integer> index2 = index.get(last); 
      if (index2==null){ 
       index2=new TreeMap<String,Integer>(); 
       index.put(last, index2); 
      } 
      index2.put(first, i); 
     } 

     System.out.print("Smith, John -> "); 
     System.out.println(Arrays.toString(m[index.get("Smith").get("John")])); 

     System.out.print("Stone -> "); 
     System.out.println(index.get("Stone")); 

     System.out.print("Full index: "); 
     System.out.println(index); 
    } 
} 

출력 : 당신이 그럴듯하게 같은 마지막으로 두 사람을 가질 수 있기 때문에 내가 준 예에서

Smith, John -> [1, Smith, John] 
Stone -> {Bob=3, Jack=1} 
Full index: {Smith={John=0}, Stein={Robert=2}, Stone={Bob=3, Jack=1}} 

, 그것은, 인덱스를 행하기 위해 마지막 이름을 매핑하는 것만으로는 충분하지 않습니다 이름. 그러나 나는 똑같은 이름을 지닌 두 사람이 없다는 가정을했습니다. 그렇지 않으면 주어진 사람 (성, 이름)으로 모두를 찾을 수 있으려면 TreeMap<String, TreeMap<String, ArrayList<Integer>>>과 같은 것이 필요할 것입니다. ID로 검색하려면 ID를 행 인덱스에 매핑하는 두 번째 인덱스 (HashMap<Integer, Integer> 일 수 있음)를 만들어야합니다.

이 작은 예제의 경우 색인을 사용하면 얻을 수있는 것이 많지 않습니다. 아마도 매트릭스 자체보다 많은 공간을 차지할 것이기 때문입니다. 그러나 레코드가 큰 경우에는 아마도 도움이 될 것입니다.

+0

안녕하세요. 귀하의 제안을 어떻게 구현할 지 완전히 이해하지 못했습니다. 배열이 있고 각 슬롯이 해시를 가리키고 해당 해시의 각 키가 다른 해시를 가리키는 경우 어떻게하면 성으로 검색 할 수 있습니까? 항목이 '1 - 스미스, 존', '2 - 스톤, 잭', 3 - 스타 인, 로버트라고합시다. 코드를 사용하여 id (2)와 성 (stone)을 사용하여 두 번째 항목을 검색하는 방법을 보여줄 수 있습니까? – Kvass

+0

예제를 추가했습니다. – Vlad

0

일반적으로 Java 데이터 구조에 여러 가지 방법으로 액세스하려는 경우 추가 "병렬"구조를 만들어야합니다.

예를 들어 배열 또는 목록이든간에 이름에 따라 정렬되거나 키가있는 "주 테이블"을 가질 수 있습니다. 그런 다음 고객 번호별로 정렬 된 두 번째 테이블을 만들고이 테이블의 각 항목은 첫 번째 테이블 또는 개체 핸들의 다른 복사본에 인덱스를 저장할 수 있습니다.

class Customer 
{ 
    public String name; 
    public int customerNumber; 
    public int shoeSize; 
    ... whatever ... 
} 
class byName implements Comparator<Customer> 
{ 
    public int compareTo(Customer c1, Customer c2) 
    { 
    return c1.name.compareTo(c2.name); 
    } 
} 
class byShoeSize implements Comparator<Customer> 
{ 
    public int compareTo(Customer c1, Customer c2) 
    { 
    return c1.shoeSize-c2.shoeSize; 
    } 
} 

... elsewhere ... 
Customer[] nameOrder=new Customer[100]; 
nameOrder[0]=new Customer("Fred Smith", 10001, 9); 
nameOrder[1]=new Customer("Mary Jones", 10002, 7); 
... etc, however we get the list initialized ... 
Arrays.sort(nameOrder, byName); 

Customer[] shoeSizeOrder=new Customer[100]; 
for (int n=0;n<customerList.length;++n) 
    byNumber[n]=customerList[n]; 
Arrays.sort(shoeSizeOrder, byShoeSize); 

(보통 면책 조항 : 내 머리 위로 떨어져 테스트되지 않은 코드 그럼 당신은 그 항목도 첫 번째 테이블을 가리 생년월일에 의해 정렬 된 세 번째 테이블 등의 예를 들어

있을 수 있습니다. 문법 오류를 용서하십시오. 오류 검사 생략 및 다른 과도한 단순화 등 아이디어 제공)

이렇게하면 하나의 목록이 이름순으로 정렬되고 다른 목록은 신발 크기별로 정렬됩니다. 그런 다음 순서대로 각 목록을 검색하고 특정 값을 찾기 위해 이진 검색을 수행 할 수 있습니다.

물론 모든 목록은 배열이어야합니다. 해시 테이블, 배열리스트 또는 순서가 있거나 키/값 매핑이있는 다른 구조가 될 수 있습니다.

동일한 데이터의 두 사본이 아니라는 점에 유의하십시오.개체 집합은 하나뿐입니다. 우리는 각 객체에 대해 두 개의 핸들을 가지고 있습니다. 각 객체에 하나씩 있습니다.