2011-12-12 89 views
3

我有一个类实现Comparator<String>,它应该以这样的方式对字符串进行排序,使得第一个字词为罗马数字的字符串应该在不以罗马数字开头的字符串之前,并且如果两个字符串都开始用罗马文字,应该有两种情况:使用Guava's ComparisonChain比较包含罗马数字的字符串

  1. 排序的罗马数字,然后如果等于由串
  2. 排序字符串的休息休息,不是罗马数字

我万特相同的,当d利用番石榴的ComparisonChain但遇到了两个问题:

  1. 调试期间在Eclipse中我看不到有什么ComparisonChain对象内(即便在ComparisonChain类是)。
  2. comparisonChain.result()在上面的第二个例子中,对于诸如“XI Something”,“I​​II Something”等值的值(转换为long是OK - 我检查了值)总是返回0(因为问题#1,我无法检查流)。

这里有什么问题?我可以使用上面的comparisonChain这样的对象(通过在一些像建设者一样的变量中添加.compare),不是吗?

此代码:

if (romanComparisionFirst) { 
    return ComparisonChain.start() 
     .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord)) 
     .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator) 
     .result(); 
    } else { 
    return ComparisonChain.start() 
     .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator) 
     .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord)) 
     .result(); 
    } 

这:

final ComparisonChain comparisionChain = ComparisonChain.start(); 
    if (romanComparisionFirst) { 
    comparisionChain 
     .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord)) 
     .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator); 
    } else { 
    comparisionChain 
     .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator) 
     .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord)); 
    } 
    return comparisionChain.result(); 

得到不同的结果 - 第一种情况是好的,第二个总是0,所以问题是:我可以使用ComparisonChain如果第二出样或者这种行为是一个错误?

+0

不是一个真正的答案(JB是完全正确的),但我可以建议有两个单独的排序 - 一个罗马人的话,另一个是尾巴? – Ray

回答

11

ComparisonChain的每个compare方法返回一个ComparisonChain,它不一定是调用比较的链。第一个片段不会忽略结果(因此是正确的),但第二个片段忽略结果,因此不正确。

如果没有这将是正确的:

comparisionChain = comparisionChain.compare(...).compare(...); 

的源代码见http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/src-html/com/google/common/collect/ComparisonChain.html#line.89

+0

所以基本上'ComparisonChain'不能用作'Immutable * .Buider'吗?我的意思是'最后的生成器 builder = ImmutableSet.builder();'然后'if(condition){builder.add(element);'?这是为什么? – Xaerxess

+0

(不能编辑上面的注释)为什么在调用'compareChain.result()'的时候不计算结果?我的意思是这个概念,我可以看到代码解释我的错误:) – Xaerxess

+0

那么,这就是番石榴决定实施比较链。它使事情变得简单一些,只要前一个已经找到结果就忽略任何后续比较。 –