我一直在寻找Java中的双向映射实现,并偶然发现了这两个库:
两者都是免费的,具有我正在寻找的双向地图实现(Apache中的BidiMap,Google中的BiMap),几乎相同的大小(Apache 493 kB,Google 499 kB)[编辑:不再是真的!]并且似乎在各方面都和我很相似.
我应该选择哪一个,为什么?是否有其他等效替代方案(必须是免费的并至少具有双向映射)?我正在使用最新的Java SE,所以不需要人为地限制Java 5或类似的东西.
据说当输入参数为null时,compareTo()应抛出NullPointerException.但是,我正在实现一个需要将字段与String类型进行比较的类.这些字段不必是强制性的.我想知道在这种情况下,
1)当输入为空时我应该返回什么?任何非空字符串在字典上是大于还是小于null?
和
2)如果这被认为是不好的做法,是否有任何支持性论点?我应该强制用户使用空字符串吗?如果使用空字符串,那不会混淆字段不适用的情况和字段为空的情况吗?如果必须抛出异常,那么除了在手册中警告用户之外,我还能做什么?
编辑:我可能不会在这里清楚地表达自己,但在我正在实现的程序中,可以为null的字符串是所有字段或类,它们不应为null.换句话说,comparisonTo()使用的对象不能为null,只有它们的私有字段可以.所以在这种情况下,我相信如果我正确地实现了compareTo(),它就不会违反传递要求,因为具有空字段的类总是被认为是相同的.我是对的还是我在解释这个错误?
谢谢大家的答案!
为什么这个代码
public class SponsoredComparator implements Comparator<SRE> {
public boolean equals(SRE arg0, SRE arg1){
return arg0.getSponsored()==arg1.getSponsored();
}
public int compare(SRE object1, SRE object2) {
Log.d("SponsoredComparator","object1.getName() == "+ object1.getName());
Log.d("SponsoredComparator","object1.getSponsored() == "+ object1.getSponsored());
Log.d("SponsoredComparator","object2.getName() == "+ object2.getName());
Log.d("SponsoredComparator","object2.getSponsored() == "+ object2.getSponsored());
Log.d("SponsoredComparator","compare return == "+ (object1.getSponsored() && object2.getSponsored() ? 0 : object1.getSponsored() ? -1 : 1));
return object1.getSponsored() && object2.getSponsored() ? 0 : object1.getSponsored() ? -1 : 1;
}
}
Run Code Online (Sandbox Code Playgroud)
抛出此异常: ERROR/AndroidRuntime(244): java.lang.IllegalArgumentException: Comparison method violates its general contract!
ERROR/AndroidRuntime(4446): at java.util.TimSort.mergeLo(TimSort.java:743) …
在比较字符串时,我宁愿不依赖实例方法,以免调用该方法的字符串为空.在.NET中,我只使用静态String.Compare(string,string,bool)方法.java提供了类似的内置"null-safe"字符串比较实用程序,还是我必须实现自己的?
Java中是否存在使用区分大小写的字符串匹配的Map实现,但是还支持null键?我知道
new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER)
Run Code Online (Sandbox Code Playgroud)
支持不区分大小写的String键匹配,但不支持null键.
我在考虑这样的事情:
public static <T extends Comparable<T>> T minOf(T...ts){
SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
return set.first();
}
public static <T extends Comparable<T>> T maxOf(T...ts){
SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
return set.last();
}
Run Code Online (Sandbox Code Playgroud)
但是不安全,这也是我想要的.
你知道解决这个问题的更好方法吗?
编辑:
评论后我也试过min():
public static <T extends Comparable<T>> T minOf(T...ts){
return Collections.min(Arrays.asList(ts), new Comparator<T>(){
public int compare(T o1, T o2) {
if(o1!=null && o2!=null){
return o1.compareTo(o2);
}else if(o1!=null){
return 1;
}else{
return -1;
}
}});
}
Run Code Online (Sandbox Code Playgroud)
你对那个怎么想的?
java ×6
collections ×3
null ×2
string ×2
android ×1
comparable ×1
comparator ×1
compare ×1
compareto ×1
contract ×1
guava ×1
static ×1