2016-08-01 38 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

如果您需要使用列表,您可以只做,或排序列表。另一种方法是改变数据结构 –