您的位置:首页 > 其它

比较器报错:Comparison method violates its general contract

2016-12-08 11:43 381 查看
<div id="article_content" class="article_content">

<p>转载自:<a target="_blank" href="http://blog.csdn.net/fanzitao/article/details/8040201">http://blog.csdn.net/fanzitao/article/details/8040201</a></p>

<p></p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

Brother Zeng遇到的错误:</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<a href="http://lib.csdn.net/base/javase" class="replace_word" title="Java SE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>.lang.IllegalArgumentException: Comparison method violates its general contract!</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

网上查到一个解释:</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

Description: The sorting algorithm used by java.util.Arrays.sort and (indirectly) by java.util.Collections.sort has been replaced. The new sort implementation may throw an IllegalArgumentException if it detects a Comparable that violates the Comparable contract.

 The previous implementation silently ignored such a situation. If the previous behavior is desired, you can use the new system property, java.util.Arrays.useLegacyMergeSort, to restore previous mergesort behavior.<br>

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

也就是说jdk 7的sort函数的实现变了,造成了这个问题,具体原因未知。</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

改一下系统设置,还是选择使用老版本的排序方法,在代码前面加上这么一句话:System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

<br>

</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

另外复习一下比较器,一个简单的例子:</p>

<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px">

类代码:</p>

<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard"
title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 481px; top: 831px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf"
loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"
flashvars="id=1&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About"
title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/131345" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png"
width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/131345/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img
src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span
class="keyword">class</span><span> Stu {  </span></span></li><li class=""><span>    <span class="keyword">public</span><span> </span><span class="keyword">double</span><span> age;  </span></span></li><li
class="alt"><span>    <span class="keyword">public</span><span> String name;  </span></span></li><li class=""><span>    <span class="keyword">public</span><span> Stu(String name,</span><span
class="keyword">double</span><span> age)  </span></span></li><li class="alt"><span>    {  </span></li><li class=""><span>        <span class="keyword">this</span><span>.name = name;  </span></span></li><li
class="alt"><span>        <span class="keyword">this</span><span>.age = age;  </span></span></li><li class=""><span>    }  </span></li><li class="alt"><span>}  </span></li></ol><div
class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="131345" snippet_file_name="blog_20131227_1_4963908"
name="code" class="java" style="display: none;">public class Stu {
public double age;
public String name;
public Stu(String name,double age)
{
this.name = name;
this.age = age;
}

}</pre><br>

<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard"
title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 481px; top: 1088px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf"
loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"
flashvars="id=2&width=18&height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About"
title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/131345" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png"
width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/131345/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img
src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">import</span><span> java.util.Collections;  </span></span></li><li
class=""><span><span class="keyword">import</span><span> java.util.Comparator;  </span></span></li><li class="alt"><span><span class="keyword">import</span><span> java.util.List;  </span></span></li><li class=""><span>  </span></li><li
class="alt"><span>  </span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CodeForBrotherZeng {  </span></span></li><li class="alt"><span>  </span></li><li
class=""><span>    <span class="comment">/**</span> </span></li><li class="alt"><span><span class="comment">     * @param args</span> </span></li><li class=""><span><span class="comment">     */</span><span>  </span></span></li><li
class="alt"><span>    <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) {  </span></span></li><li
class=""><span>            Stu stu1=<span class="keyword">new</span><span> Stu(</span><span class="string">"foyd"</span><span>,</span><span class="number">22.1</span><span>);  </span></span></li><li
class="alt"><span>            Stu stu2=<span class="keyword">new</span><span> Stu(</span><span class="string">"teddy"</span><span>,</span><span class="number">19.1</span><span>);  </span></span></li><li
class=""><span>            Stu stu3=<span class="keyword">new</span><span> Stu(</span><span class="string">"dean"</span><span>,</span><span class="number">26.1</span><span>);  </span></span></li><li
class="alt"><span>            Stu stu4=<span class="keyword">new</span><span> Stu(</span><span class="string">"lucas"</span><span>,</span><span class="number">19.1</span><span>);  </span></span></li><li
class=""><span>            Stu stu5=<span class="keyword">new</span><span> Stu(</span><span class="string">"tina"</span><span>,</span><span class="number">26.1</span><span>);  </span></span></li><li
class="alt"><span>              </span></li><li class=""><span>            List<Stu> list = <span class="keyword">new</span><span> ArrayList<Stu>();  </span></span></li><li
class="alt"><span>            list.add(stu1);  </span></li><li class=""><span>            list.add(stu2);  </span></li><li
class="alt"><span>            list.add(stu3);  </span></li><li class=""><span>            list.add(stu4);  </span></li><li
class="alt"><span>            list.add(stu5);  </span></li><li class=""><span>              </span></li><li class="alt"><span>            Comparator<Stu> comparator = <span
class="keyword">new</span><span> Comparator<Stu>() {  </span></span></li><li class=""><span>                <span class="keyword">public</span><span> </span><span
class="keyword">int</span><span> compare(Stu p1, Stu p2) {</span><span class="comment">//return必须是int,而str.age是double,所以不能直接return (p1.age-p2.age)</span><span>  </span></span></li><li class="alt"><span>                    <span
class="keyword">if</span><span>((p1.age-p2.age)<</span><span class="number">0</span><span>)   </span></span></li><li class=""><span>                        <span
class="keyword">return</span><span> -</span><span class="number">1</span><span>;  </span></span></li><li class="alt"><span>                    <span
class="keyword">else</span><span> </span><span class="keyword">if</span><span>((p1.age-p2.age)></span><span class="number">0</span><span>)  </span></span></li><li class=""><span>                        <span
class="keyword">return</span><span> </span><span class="number">1</span><span>;  </span></span></li><li class="alt"><span>                    <span
class="keyword">else</span><span> </span><span class="keyword">return</span><span> </span><span class="number">0</span><span>;  </span></span></li><li class=""><span>                }  </span></li><li
class="alt"><span>            };  </span></li><li class=""><span>            <span class="comment">//jdk 7sort有可能报错,</span><span>  </span></span></li><li
class="alt"><span>            <span class="comment">//加上这句话:System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");</span><span>  </span></span></li><li class=""><span>            <span
class="comment">//表示,使用以前版本的sort来排序</span><span>  </span></span></li><li class="alt"><span>            Collections.sort(list,comparator);  </span></li><li class=""><span>              </span></li><li
class="alt"><span>            <span class="keyword">for</span><span>(</span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;i<list.size();i++)  </span></span></li><li
class=""><span>            {  </span></li><li class="alt"><span>                System.out.println(list.get(i).age+<span
class="string">"  "</span><span>+list.get(i).name);  </span></span></li><li class=""><span>            }  </span></li><li class="alt"><span>              </span></li><li
class=""><span>    }  </span></li><li class="alt"><span>  </span></li><li class=""><span>}  </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img
src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="131345" snippet_file_name="blog_20131227_2_8311978" name="code" class="java" style="display: none;">import java.util.Collections;

import java.util.Comparator;

import java.util.List;

public class CodeForBrotherZeng {

/**
* @param args
*/
public static void main(String[] args) {
Stu stu1=new Stu("foyd",22.1);
Stu stu2=new Stu("teddy",19.1);
Stu stu3=new Stu("dean",26.1);
Stu stu4=new Stu("lucas",19.1);
Stu stu5=new Stu("tina",26.1);

List<Stu> list = new ArrayList<Stu>();
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
list.add(stu5);

Comparator<Stu> comparator = new Comparator<Stu>() {
public int compare(Stu p1, Stu p2) {//return必须是int,而str.age是double,所以不能直接return (p1.age-p2.age)
if((p1.age-p2.age)<0) 
return -1;
else if((p1.age-p2.age)>0)
return 1;
else return 0;
}
};
//jdk 7sort有可能报错,
//加上这句话:System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
//表示,使用以前版本的sort来排序
Collections.sort(list,comparator);

for(int i=0;i<list.size();i++)
{
System.out.println(list.get(i).age+"  "+list.get(i).name);
}

}

}</pre><br>

<br>

   

</div>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: