我可以在没有引用的情况下向 TreeMap 添加对象吗

Can I add a object to TreeMap without reference

我有基本的矩形 class。我可以在没有引用的情况下使用该对象吗?我试过了,但似乎只添加了最后一个。

public class Rectangle implements Comparable {

int a1;
int a2;

public Rectangle (int a1, int a2) {
    this.a1= a1;
    this.a2= a2;
}

    TreeMap<Rectangle, String > rectangleStringTreeMap = new TreeMap<>();
    rectangleStringTreeMap.put(new Rectangle(2,5),"This is first");
    rectangleStringTreeMap.put(new Rectangle(3,7),"This is second");
    rectangleStringTreeMap.put(new Rectangle(4,8),"This is third");

我在使用比较器而不是使用 Comparable 接口时解决了这个问题。

public class Rectangle{

int a1;
int a2;

public Rectangle (int a1, int a2) {
    this.a1= a1;
    this.a2= a2;
}

     TreeMap<Rectangle, String > rectangleStringTreeMap = new TreeMap<>(new Comparator<Rectangle>() {
        @Override
        public int compare(Rectangle o1, Rectangle o2) {
            if (o1.a1 > o2.a1 && o1.a2 > o2.a2) {
                return 1;
            } else if (o1.a1 < o2.a1 && o1.a2 < o2.a2) {
                return -1;
            } else return 0;
        }
    });
    rectangleStringTreeMap.put(new Rectangle(2,5),"This is first");
    rectangleStringTreeMap.put(new Rectangle(3,7),"This is second");
    rectangleStringTreeMap.put(new Rectangle(4,8),"This is third");

如果您的 class 主要是作为透明的不可变数据载体,请将您的 class 定义为 record。在记录中,编译器通过考虑每个成员字段隐式创建构造函数、getter、equals & hashCodetoString

使您的 class 实现 Comparable 使用泛型而不是原始类型。

定义一个有两个子句的Comparator,做比较工作。

类似于这个未经测试的代码。

public record Rectangle ( int a1 , int a2 ) implements Comparable < Rectangle >
{
    static private Comparator < Rectangle > comparator = 
            Comparator
                .comparingInt( Rectangle :: a1 )
                .thenComparingInt( Rectangle :: a2 ) ;
    
    @Override
    public int compareTo( Rectangle other )
    {
        return Rectangle.comparator.compare( this , other ) ;
    }
}

继续你的地图。但是将您的地图声明为更通用的接口 NavigableMap 而不是具体的 class TreeMap.

NavigableMap < Rectangle, String > rectangleStringNavMap = new TreeMap<>();
rectangleStringNavMap.put( new Rectangle(2,5), "This is first" );
rectangleStringNavMap.put( new Rectangle(3,7), "This is second" );
rectangleStringNavMap.put( new Rectangle(4,8), "This is third" );

如果跨线程使用地图,请使用 ConcurrentNavigableMap 接口,并且 ConcurrentSkipListMap class。