2016-08-01 70 views
-2

我有元組什麼是掃名單

List<Tuple2<String,String> list; 

什麼是掃它來搜索一個元素中檢索它或修改它的最有效方法大名單的最有效的方法?

爲如:

String elementToSearch="l"; 
list={(a,hh)(b,rr)(c,kk)(d,jj)(l,mm).....} 
Tuple2<String,String> result=(l,mm) 

我想,使用循環「爲」,它的工作,而是因爲這是一個大名單,我不知道這是否是做的最好的方式。

+2

這是[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)的一個很好的例子。你很可能在尋找某種地圖。 –

回答

3

如果元組的第一個元素是關鍵(沒有其他的元組具有相同的第一個元素),你很可能需要一個Map ...

注:的重複鍵,這一次沒有按」工作得很好:只會保留一個!

Map<String, String> myMap = new HashMap<>(); 

myMap.put("a", "bb"); 
//... 

String result = myMap.get("a"); 
//result will be "bb" 

如果第一個元素是不是關鍵,所以有可能是("l","mm")("l","ee")過,那麼它是一個比較棘手:

// for clarity, a helper method 
private static <K,V> void add(Map<K, Set<V>> mapToAdd, K key, V value) { 
    Set<V> innerSet = mapToAdd.get(key); 
    if(innerSet==null) { 
    innerSet = new HashSet<>(); 
    mapToAdd.put(key, innerSet); 
    } 
    innerSet.add(value); 
} 

//... 

Map<String, Set<String>> myMap = new HashMap<>(); 
add(myMap, "l", "mm"); 
add(myMap, "l", "ee"); 

// for searching, we also need a helping method: 

private static <K,V> boolean find(Map<K, Set<V>> mapToFind, K key, V value) { 
    boolean found = false; 
    Set<V> setToFind = mapToFind.get(key); 
    if(setToFind!=null) { 
     found = setToFind.contains(value); 
    } 
    return found; 
} 
// result true: 
System.out.println(find(myMap,"l","mm")); 

// result true: 
System.out.println(find(myMap,"l","ee")); 

// result false: 
System.out.println(find(myMap,"l","mddddm")); 

注:如果有完整的副本,這一個只保留其中一個!

+0

地圖不是直接替換列表。一個列表可以包含重複項,一個Map不可以,另外一個列表可以通過代碼不直接擁有的代碼返回 –

+0

是否意味着我必須將列表轉換爲地圖? – ham

+0

不,如果您需要按鍵搜索使用地圖。如果您需要搜索「整個」元素,請使用HashSet,但在選擇前還需要考慮其他信息。 –

-1

如果需要使用列表:如果列表進行排序

你可以用一個binary search algorithm搜索。

如果沒有排序,只需使用for循環。


如果你可以改變數據結構遵循的@ppterka


答案要搜索的第一個(也是唯一的第一個)元素匹配Tuple2的第一部分是:

Tuple2<String,String> search(List<Tuple2<String, String>> list, String a) { 
    for (Tuple2<String, String> tuple : list) { 
     if (tuple.getFirst().equals(a)) { 
      return tuple; 
     } 
    } 
    return null; // Or thrown a NotFoundException 
} 


... 

Tuple2<String,String> searched = search(list, "l"); 
+2

如何搜索'HashSet >爲第一個字符串?例如:如果你有''l'',你會如何找到''l「,」mm「'?請說明! – ppeterka

+0

@Davide Lorenzo MARINO我不想用於循環bcz例如,如果我需要最後一個元素,我需要掃描整個列表來找到它, – ham

+0

如果您需要使用列表,您可以只做,或排序列表。另一種方法是改變數據結構 –