Java 查找部分重复值并保留特定的

Java 查找部分重复值并保留特定的,java,list,duplicates,hashset,Java,List,Duplicates,Hashset,我有一个列表,其中包含一个值和另一个列表,在本例中是一个带有相应车站列表的车次号。但是,有重复的车次号,可能有不同的车站。由此,我试图创建一个新的列表,保存拥有最多车站的车次 例如,如果我有一个列表,其中包含: String trainNumber = 1, List trainNumber = [Station1, Station3] String trainNumber = 2, List trainNumber = [Station1, Station2, Station3] St

我有一个列表,其中包含一个值和另一个列表,在本例中是一个带有相应车站列表的车次号。但是,有重复的车次号,可能有不同的车站。由此,我试图创建一个新的列表,保存拥有最多车站的车次

例如,如果我有一个列表,其中包含:

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]
我已经看到Set用于删除重复的列表项,但是我需要指定要保留的项

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 newList=newhashset();
用于(列车:列车概述){
字符串trainNumber=train.getTrainNumber();
int stationSize=train.getStations().size();
int最大=0;
用于(列车副本:列车概述){
if(trainNumber.equals(trainCopy.getTrainNumber())){
int stationCopySize=trainCopy.getStations().size();
如果(stationCopySize>最大)最大=stationCopySize;
}
}
如果(togSize>=最大值){
newList.add(tog);
}
}
trainOverview.clear();
列车概述。添加所有(新列表);
现在这种方法可以用了,但我觉得非常混乱。我正在使用HashSet删除具有相同数量站点的重复项(这种情况也会发生)。肯定有更好的办法解决这个问题

编辑:感谢您的回答,但我看到put方法替换了键的值。在我的情况下,除了新的值外,我想保留第一次映射到键(车次号)的值(车站)

我以前从未使用过地图,但这是我的方法(不确定我是否正确使用它):

Map overview=newtreemap();
用于(列车:列车概述){
List lista=overview.get(train.getTrainNumber());
//如果键已经存在,则合并列表,并用合并列表替换旧值
if(overview.containsKey(train.getTrainNumber())){
Set setboth=新哈希集(lista);
setboth.addAll(train.getStations());
lista.clear();
lista.addAll(setboth);
overview.put(train.getTrainNumber(),lista);
}
//如果不存在密钥,请创建一个新条目
否则{
overview.put(train.getTrainNumber(),train.getStations());
}   
}

不要有两个列表,只需使用
映射即可。
trainNumber
将是唯一的键,您可以轻松地从地图中的相应列表中添加或删除站点

更新

正如@ipavlic建议的那样,使用
Map
,因为集合不允许重复元素

更新2

这里有一个小例子,有一些评论。该示例演示如何将贴图与集合结合使用。您应该而不是将其复制到代码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;
  }
}

我想最好是
Map
<代码>车次号
作为唯一键,并为车站设置,以避免重复。

创建一个从车次号到一组车站的映射,只需填充即可。更好的是,把一个列表列成一个集合。考虑到火车站,一个
集合可能不是最好的主意,因为它不关心火车从那里停下来的顺序。示例OP张贴了,他按编号对车站进行了排序,因此他可以使用
树集
。但是你是对的,如果元素的顺序具有语义,那么他最好使用列表。谢谢,这似乎很有效。然而,我在将旧地图值与新地图值组合时遇到问题。我试图在没有重复值的情况下合并列表(正如您在我的编辑中看到的)。但我得到了重复的站点。我为您添加了一些示例代码,展示了如何将地图与集合作为值一起处理(您也可以对列表、其他地图等使用这种方法)。
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;
  }
}
ADDED = true
ADDED = true
ADDED = false
Stations of Train1 = [Station1, Station2]