2011-02-15 3 views
2

를 사용하는 경우 현재 인덱스를 잡아 방법 :이 목록에서 List<X> 을, 우리는 소요, Maps.uniqueIndex 방법이 구아바 com.google.common.collect, 사용 Map<F(X), X>우리는 항목의 목록이 Maps.uniqueIndex

를 만들 싶습니다 목록을 입력으로 사용하고 을 사용하면 요소에 함수를 적용 할 수 있습니다.

이것은 모두 훌륭합니다. 예를 들어 :

List<File> to Map<String, File> 

mapOfFileNames = Maps.uniqueIndex(fileList, new Function<File, String>() { 
      @Override 
      public String apply(@Nullable File input) { 
       return input.getName(); 
      } 
     }); 

목록에서 현재 항목 (인덱스)의, 우리는 위치의 보류를 얻을 수있는 방법, 는, 예를 들어 Maps.uniqueIndex

사용하는 내 질문에 List<File> to Map<Integer, File>를 변환하는 키를 List에있는 File 요소의 위치로 지정합니다. 따라서 현재 요소의 색인에 액세스해야합니다.

이것이 가능한 방법을 알고 계십니까?

고맙습니다.

답변

8

왜이 작업을 수행 하시겠습니까? 색인으로 List의 조회를 수행 할 수 있다는 점을 감안할 때 실제로 그 유용성을 알 수는 없습니다. Function에서 입력 항목의 색인을 얻는 것은 각 항목에 indexOf을 수행해야하므로 낭비입니다. 당신이 정말로 이렇게 할 경우에, 나는 다만 말하고 싶지만 :

List<File> list = ... 
Map<Integer, File> map = Maps.newHashMap(); 
for (int i = 0; i < list.size(); i++) { 
    map.put(i, list.get(i)); 
} 

을 관련 메모에서, 모든 ImmutableCollection의 당신은 어떤 ImmutableMap에 인덱스 기반 검색을 할 수 있도록 수있는 asList() 뷰를 가지고있다. Maps.uniqueIndex은 원본 컬렉션의 주문도 보존합니다. 예제 사용 :

ImmutableMap<String, File> mapOfFileNames = Maps.uniqueIndex(...); 
/* 
* The entry containing the file that was at index 5 in the original list 
* and its filename. 
*/ 
Map.Entry<String, File> entry = mapOfFileNames.entrySet().asList().get(5);