我可以在没有引用的情况下向 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
& hashCode
和 toString
。
使您的 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。
我有基本的矩形 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
& hashCode
和 toString
。
使您的 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。