当前位置: 首页 > 知识库问答 >
问题:

Java:允许重复的排序列表/集合

韩寒
2023-03-14

我有一个程序有很多数据对象。每种方法都实现了可比性,并设置为从最高到最低(基于简单的长值)排序,包括重复的值。我希望这些对象存储在一个集合/列表中,这样我就可以遍历它,并在其各自的位置取出每个对象。

我已经研究过使用树集,但是这不允许重复,因此只保留具有相同值的多个对象中的一个。然后我找到了TreeMultiset,它可以保持元素具有相同的值。唯一的问题是,它只是存储同一对象的副本,而不是多个相等的对象。

是否有我可以使用的库/内置对象可以实现我想要的功能,或者我应该自己创建一个实现?

注意:我不想在TreeMultiset中复制对象的原因是,该对象包含用户的唯一ID和时间值(这是比较的结果)

共有1个答案

柯乐童
2023-03-14

可以使用包装器类将相同的对象装箱,例如:

class MyContainer:IComparable{
    public int compareValue;
    public List<object> data;

    public int CompareTo(MyContainer other){
        return this.compareValue - other.compareValue;
    }

    public void AddItem(object item){
        data.add(item);
    }

    public object GetItem(int Id){...}
}

class Program()
{
 TreeSet<MyContainer> data;
 public static void main(){
    data.AddToContainer("aaa");
    data.AddToContainer("aaa");
    data.AddToContainer("ccc");

 }

 public void AddToContainer(object item){
    if(data.contains(item)){
       data.get(item).AddItem(item);  
    }
    else{
       MyContainer cont = new MyContainer();
       cont.AddItem(item);
       data.add(cont);
    }
  }

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

  • 我已经列出了对数。我想先根据键对它们进行排序,如果键相同,则根据值进行排序。 我尝试了以下代码,但引发了与类型不兼容的异常:无法推断类型变量T 错误: 不兼容的类型:无法推断类型变量T(参数不匹配;类对中的无效方法引用方法getKey无法应用于所需的给定类型:未找到参数:对象原因:实际参数列表和形式参数列表长度不同) 其中T、K、V是类型变量:T扩展在方法比较中声明的对象IT(ToIntFunct

  • 我有一个linkedhashmap的列表,我需要根据linkedhashmap的属性对列表进行排序。 这是我的LinkedHashMap; 我想根据“代码”属性对此列表进行排序。

  • 具体来说,我需要一个使用一个字段A进行访问和一个不同的字段(字段S)进行排序的集合,但是一个接受重复的排序集合就足够了。 我经常需要这个集合,而TreeMap不是一个选项,因为它不允许重复。所以现在是时候问这里了。正如在这里和这里的stackoverflow中指出的,有几个变通方法,即: PriorityQueue:缓慢更新(删除(对象)添加(对象)),基本键装箱 斐波那契堆:内存浪费(?)