【问题标题】:Unable to populate a HashMap that has a TreeSet as a parameter无法填充以 TreeSet 作为参数的 HashMap
【发布时间】:2013-11-14 20:39:23
【问题描述】:

我有这张地图:

Map<City, TreeSet<Individual>> cityIndividualMap = new HashMap<City, TreeSet<Individual>>();

我使用此函数填充此地图:

public void add(List<Individual> individuals){
    for (Individual individual : individuals){
        individualSortedSet.add(individual);

        for(City city:individual.getCities()){
            TreeSet<Individual> individualList;

            if (cityIndividualMap.containsKey(city))
                individualSet = cityIndividualMap.get(city);
            else
                individualSet = new TreeSet<Individual>( new FitnessComparator());

            individualSet.add(individual);
            cityIndividualMap.put(city, individualSet);
        }
    }
} 

这是我的比较器:

public class FitnessComparator implements Comparator<Individual> {
    @Override
    public int compare(Individual individual1, Individual individual2) {
        if (individual1.getFitness() == individual2.getFitness())
            return 0;
        return (individual1.getFitness() > individual2.getFitness())? 1 : -1;
    }
}

单个类只是一个数据类..所以我不会在这里复制它。

出于某种非常奇怪的原因,CityIndi​​vidualMaps 值只包含一个元素!我在调试模式下执行了很多次,但看不到为什么只能添加一项​​。请你检查一下吗?

【问题讨论】:

  • 请同时发布 Individual 类 - 它可以保存密钥,因为 TreeSet 使用 equals 方法来确定其中是否已经存在。
  • @Rich:不,TreeSet 不使用等于。它使用比较器。
  • 这会教我略读 JavaDoc

标签: java hashmap populate treeset sortedset


【解决方案1】:

您不断用新的列表覆盖每个城市的单独列表。变化:

TreeSet<Individual> individualList;

if (cityIndividualMap.containsKey(city))
    individualSet = cityIndividualMap.get(city);
else
    individualSet = new TreeSet<Individual>( new FitnessComparator());

individualSet.add(individual);
cityIndividualMap.put(city, individualSet);

收件人:

TreeSet<Individual> individualList = cityIndividualMap.get(city);

if (individualList == null)
{
    individualList = new TreeSet<Individual>( new FitnessComparator());
    cityIndividualMap.put(city, individualList);        
}
individualList.add(individual);

【讨论】:

    【解决方案2】:

    很奇怪,我运行了你的代码,它有点工作,除了以下例外:

    1. “individualList”和“individualSet”之间似乎有混淆

    2. 'cityIndi​​vidualMap' 的声明不一致(Treeset 与 hashmap),根据您的使用情况,我认为它是一个 HashMap

    3. 类“City”应该有hashCode + equals,否则你可以找到几个具有相同City的键

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 2019-01-09
      • 1970-01-01
      • 2020-11-18
      • 2013-12-19
      • 1970-01-01
      相关资源
      最近更新 更多