정렬 속도를 높이기 위해 색인 된 여러 행의 행렬을 가질 수 있는지 알고 싶었습니다. MySQL에서는 여러 열에 대해 색인을 생성 할 수 있으므로 테이블에서 요소를 빠르게 찾을 수 있지만 표준 Java 행렬에서 가능한지 여부는 알 수 없습니다. 예를 들어, 내 데이터는 ID, 이름 및 성을 가진 3 열 매트릭스이며이 테이블에 많은 항목이 있습니다. 지금 나는 mat [5]와 같은 것을 말할 수 있고 id가 5 인 개인에 대한 엔트리를 얻을 수 있습니다. 그러나 last name 컬럼으로 엔트리를 검색 할 수 있기를 원합니다. Java에서이 작업을 가장 효율적으로 수행하려면 어떻게해야합니까?자바 행렬 색인하기
답변
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>
일 수 있음)를 만들어야합니다.
이 작은 예제의 경우 색인을 사용하면 얻을 수있는 것이 많지 않습니다. 아마도 매트릭스 자체보다 많은 공간을 차지할 것이기 때문입니다. 그러나 레코드가 큰 경우에는 아마도 도움이 될 것입니다.
일반적으로 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);
(보통 면책 조항 : 내 머리 위로 떨어져 테스트되지 않은 코드 그럼 당신은 그 항목도 첫 번째 테이블을 가리 생년월일에 의해 정렬 된 세 번째 테이블 등의 예를 들어
있을 수 있습니다. 문법 오류를 용서하십시오. 오류 검사 생략 및 다른 과도한 단순화 등 아이디어 제공)
이렇게하면 하나의 목록이 이름순으로 정렬되고 다른 목록은 신발 크기별로 정렬됩니다. 그런 다음 순서대로 각 목록을 검색하고 특정 값을 찾기 위해 이진 검색을 수행 할 수 있습니다.
물론 모든 목록은 배열이어야합니다. 해시 테이블, 배열리스트 또는 순서가 있거나 키/값 매핑이있는 다른 구조가 될 수 있습니다.
동일한 데이터의 두 사본이 아니라는 점에 유의하십시오.개체 집합은 하나뿐입니다. 우리는 각 객체에 대해 두 개의 핸들을 가지고 있습니다. 각 객체에 하나씩 있습니다.
- 1. 자바 행렬 곱셈 (FAST)
- 2. 행렬, 거리, 자바 스크립트
- 3. 자바 자마 행렬 문제
- 4. ElasticSearch로 CouchDB 뷰 색인하기
- 5. python : dict로 목록 색인하기
- 6. itertools를 사용하여 배열 색인하기
- 7. Lucene으로 복합 유형 색인하기
- 8. 파이썬에서 유사한 항목 색인하기
- 9. Lucene을 사용하여 위키 백과 색인하기
- 10. 자바 6의 병렬 행렬 곱셈
- 11. mysql에서 위치 열을 다시 색인하기
- 12. Google에서 동적 PHP 페이지 색인하기
- 13. OpenCV의 안드로이드 자바 행렬 행렬 (관심 ROI 지역)
- 14. 행렬 함수로 행렬
- 15. ROW에서 행렬 행렬 연산
- 16. 행렬
- 17. 배열로부터 2 차원 행렬 생성하기 (자바)
- 18. 자바 스크립트 행렬 및 거리 계산
- 19. (N) Hibernate.Search : 하나의 필드에 다른 속성 색인하기
- 20. Lucene.NET을 사용하여 내 ASP.NET MVC보기의 내용 색인하기
- 21. Matlab - 문자열 값을 사용하여 배열 색인하기
- 22. Python의 행렬 및 역 행렬
- 23. OpenGL 행렬 VS DirectX 행렬
- 24. 행렬 - 행렬 곱셈/행렬 - 벡터 곱셈 알고리즘의 다른 유형은 무엇입니까
- 25. 행렬 타입에 의한 변환 행렬 곱셈
- 26. opencv : 행렬 또는 행렬 벡터를 만듭니다.
- 27. 다른 행렬 당 행렬 Repmat 행 - MATLAB
- 28. 행렬 열 이름으로 행렬 열 값 추출
- 29. 행렬 함수를 행렬 목록에 적용하는 방법
- 30. R 행렬 연산자가 행렬 목록에 있습니다.
안녕하세요. 귀하의 제안을 어떻게 구현할 지 완전히 이해하지 못했습니다. 배열이 있고 각 슬롯이 해시를 가리키고 해당 해시의 각 키가 다른 해시를 가리키는 경우 어떻게하면 성으로 검색 할 수 있습니까? 항목이 '1 - 스미스, 존', '2 - 스톤, 잭', 3 - 스타 인, 로버트라고합시다. 코드를 사용하여 id (2)와 성 (stone)을 사용하여 두 번째 항목을 검색하는 방법을 보여줄 수 있습니까? – Kvass
예제를 추가했습니다. – Vlad