当前位置: 首页 > 面试题库 >

允许重复的TreeSet或TreeMap

章心水
2023-03-14
问题内容

我需要Collection对元素进行排序,但不会删除重复项。

我已经去了TreeSet,因为TreeSet实际上将值添加到支持的TreeMap

public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

然后TreeMap使用Comparators compare逻辑删除重复项

我写了一个Comparator在元素相等的情况下返回1而不是0的a
。因此,在元素相等的情况下,TreeSet带有此元素Comparator将不会覆盖重复项,而只会对其进行排序。

我已经为简单String对象测试过,但是我需要一组自定义对象。

public static void main(String[] args)
{       
        List<String> strList = Arrays.asList( new String[]{"d","b","c","z","s","b","d","a"} );      
        Set<String> strSet = new TreeSet<String>(new StringComparator());       
        strSet.addAll(strList);     
        System.out.println(strSet); 
}

class StringComparator implements Comparator<String>
{
    @Override
    public int compare(String s1, String s2)
    {
        if(s1.compareTo(s2) == 0){
            return 1;
        }
        else{
            return s1.compareTo(s2);
        }
    }
}

这种方法是好的还是有更好的方法来实现呢?

编辑

实际上,我有以下类的ArrayList:

class Fund 
{
    String fundCode;
    BigDecimal fundValue;
    .....

    public boolean equals(Object obj) {
    // uses fundCode for equality
    }
}

我需要fundCode最高的fundValue


问题答案:

我需要所有基金价值最高的基金代码

如果那是您要排序的唯一原因,我建议根本不要排序。排序主要带来 O(n log(n)) 的复杂性。查找最大值仅具有 O(n)
的复杂度,并且可以通过列表的简单迭代来实现:

List<Fund> maxFunds = new ArrayList<Fund>();
int max = 0;
for (Fund fund : funds) {
    if (fund.getFundValue() > max) {
        maxFunds.clear();
        max = fund.getFundValue();

    }
    if (fund.getFundValue() == max) {
        maxFunds.add(fund);

    }
}

您可以通过使用Guava等第三级库来避免该代码。请参阅:如何从Guava中的List获取max()元素



 类似资料:
  • 问题内容: 我似乎无法使实例正常工作。我使用的代码如下: 子类 该代码输出 问题答案: 您需要覆盖。而不是这样做,您实现了一个带有signature 的方法。因此,您使用的是为相等性测试定义的默认方法。 默认实现基于对象标识,因此,该集合“允许”您添加两个在语义上相等的不同对象。

  • 我正在检查< code>HashSet的< code>add方法。有人提到 如果该集合已经包含元素,则调用保持集合不变,并返回false。 但是方法在内部保存中的值 的方法声明 将指定值与该映射中的指定键相关联。如果映射先前包含该键的映射,则旧值将被替换。 那么,如果 的 方法替换了旧值,那么 方法如何在元素重复的情况下保持集合不变?

  • 问题内容: 我需要解析一个json文件,不幸的是,该文件不遵循原型。我的数据有两个问题,但是我已经找到了解决方法,所以我只在最后提一下,也许有人也可以提供帮助。 所以我需要解析这样的条目: json默认解析器更新字典,因此仅使用最后一个条目。我不得不以某种方式存储另一个,我也不知道如何做到这一点。我还必须将密钥以它们在文件中出现的顺序存储在几个字典中,这就是为什么我使用OrderedDict这样做

  • 我有 REGEX,我希望在下面排除某些字符。正确排除这些字符:£“~#¬|{} 但这些不是: @[]/?;: 因此,例如,test£test 被正确标识为无效,但test@test被错误地标识为有效。 在https://regex101.com/上测试发现问题在于括号,并指出我需要转义第一个([括号]和-[连字符],就像这样- ^[a-zA-z0-9!$%^ 有什么办法可以让这个正则表达式按照我想

  • 我正在做一个项目,用户必须上传之前提交一个表单的图像。目前我的代码正在工作,但它选择任何格式大小,这是不需要在我的项目,所以我的目标是限制用户只选择图像文件格式定义,如jpg,jpeg和png从我希望用户只选择jpg,png和jpeg文件。 下面是我的工作代码: