2013-09-04 2 views
2

값과 다른 목록을 포함하는 목록이 있습니다.이 경우 해당 스테이션 목록이있는 trainNumber입니다. 그러나 trainNumbers가 중복되어 스테이션이 다를 수 있습니다. 이것에서 나는 기차를 유지하는 새로운 목록을 만들려고 노력하고 있습니다. 가장 많은 방송국을 가진 방송국 수입니다. 나는 목록이있는 경우부분 중복 값 찾기 및 특정 유지

예를 들어이 포함 된 :

String trainNumber = 1, List trainNumber = [Station1, Station3] 
String trainNumber = 2, List trainNumber = [Station1, Station2, Station3] 
String trainNumber = 3, List trainNumber = [Station1, Station3] 
String trainNumber = 3, List trainNumber = [Station3] 

내가 새 목록에 포함 할 :

String trainNumber = 1, List trainNumber = [Station1, Station3] 
String trainNumber = 2, List trainNumber = [Station1, Station2, Station3] 
String trainNumber = 3, List trainNumber = [Station1, Station3] 

내가 본 설정의 사용을 중복 목록 항목을 제거하는, 그러나 나는 유지하고 싶은 항목을 지정해야합니다.

HashSet<Trains> newList = new HashSet<Trains>(); 
    for(Trains train: trainOverview){ 
     String trainNumber = train.getTrainNumber(); 
     int stationSize = train.getStations().size(); 
     int largest = 0; 
     for(Trains trainCopy: trainOverview){ 
      if(trainNumber.equals(trainCopy.getTrainNumber())){ 
       int stationCopySize = trainCopy.getStations().size(); 
       if(stationCopySize > largest) largest = stationCopySize; 
      } 
     } 
     if(togSize >= largest){ 
      newList.add(tog); 
     } 
    } 

    trainOverview.clear(); 
    trainOverview.addAll(newList); 

이제이 문제가 발생하지만 매우 혼란 스럽습니다. HashSet을 사용하여 똑같은 양의 스테이션이있는 중복을 제거합니다. 분명히이 문제에 대해 더 나은 방법이 있어야 할 것입니다.

EDIT : 감사합니다.하지만 put 메서드가 키 값을 대체한다는 것을 알았습니다. 필자는 새로운 경우에 처음으로 키 (trainNumber)에 매핑 된 값 (스테이션)을 유지하려고합니다.

내가 전에지도와 함께 일한 적이 있지만, 내 접근 방법이다 (필자는 올바른을 사용하는 경우 확실하지) :

Map<String, List<Station>> overview= new TreeMap<String, List<Station>>(); 
    for(Trains train: trainOverview){ 
     List<Stations> lista = overview.get(train.getTrainNumber()); 
     //Merge lists if the key already exists, and replace the old value with the merged list 
     if(overview.containsKey(train.getTrainNumber())){ 
      Set setboth = new HashSet(lista); 
      setboth.addAll(train.getStations()); 
      lista.clear(); 
      lista.addAll(setboth); 
      overview.put(train.getTrainNumber(), lista); 
     } 
     //If no key exists, create a new entry 
     else{ 
      overview.put(train.getTrainNumber(), train.getStations()); 
     } 
    } 
+0

trainNumbers에서 일련의 스테이션으로 맵핑을 작성하고 채우십시오. – ipavlic

답변

4

을 대신 두 목록 그냥 Map<String, List<Station>>를 사용할 필요없이. trainNumber은 고유 한 키가 될 것이므로지도의 해당 목록에서 방송국을 쉽게 추가하거나 삭제할 수 있습니다.

세트가 중복 요소를 허용하지 않기 때문에, @ipavlic 사용 Map<String, Set<Station>>에 의해 제안 UPDATE

. 일부 의견 여기에 약간의 예를 UPDATE2

. 이 예는 세트와 결합 된 맵을 사용하는 방법을 보여줍니다. 이 아니라이 코드를 1 : 1로 복사해야합니다. 이는 객체 지향 접근 방식이 아니기 때문입니다. 지도는 어떤 객체에 캡슐화되어야합니다.

import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 
import java.util.TreeSet; 

public class MapSetExample 
{ 
    public static void main(String[] args) 
    { 
    Map<String, Set<String>> map = new HashMap<String, Set<String>>(); 
    System.out.println("ADDED = " + add(map, "Train1", "Station1")); 
    System.out.println("ADDED = " + add(map, "Train1", "Station2")); 
    System.out.println("ADDED = " + add(map, "Train1", "Station1")); 

    System.out.println("Stations of Train1 = " + map.get("Train1")); 

    } 

    private static boolean add(Map<String, Set<String>> map, String key, String station) { 
    Set<String> set = map.get(key); 

    /* If map.get() returns null, that means there is no set 
    * in the map associated with given key. 
    * 
    * In that case we create a new set. 
    * 
    * If there is already a set, we use that one. 
    */ 
    if (set == null) { 
     set = new TreeSet<String>(); 
     map.put(key, set); 
    } 
    /* False if station is already in set. At this point you could also delete sth. etc. */ 
    boolean success = set.add(station); 
    return success; 
    } 
} 

OUTPUT은

ADDED = true 
ADDED = true 
ADDED = false 
Stations of Train1 = [Station1, Station2] 
+2

더 좋게 설정하면 목록을 만듭니다. – ipavlic

+0

기차역을 잘 고려하면 기차가 멈추는 순서를 신경 쓰지 않기 때문에 '집합'이 최선의 아이디어가 아닐 수도 있습니다. –

+0

게시 된 OP 예제에서 그는 방송국을 번호순으로 분류하여 'TreeSet '. 그러나 당신이 맞습니다. 요소의 순서가 의미 론적이라면, 그는 바람직하게 목록을 사용해야합니다. – mike

1

더 나은 Map<String, Set<Station>> 될 것이라고 생각합니다. 고유 한 키로 trainNumber을 지정하고 반복을 피하기 위해 스테이션에 대해 Set을 지정하십시오.