﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-brucewang-文章分类-Eclipse</title><link>http://www.blogjava.net/brucewang/category/21588.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 06 Feb 2010 02:49:11 GMT</lastBuildDate><pubDate>Sat, 06 Feb 2010 02:49:11 GMT</pubDate><ttl>60</ttl><item><title>交换 EList 中的元素位置，当 unique 为 true 时。</title><link>http://www.blogjava.net/brucewang/articles/308290.html</link><dc:creator>都市鸟人</dc:creator><author>都市鸟人</author><pubDate>Tue, 05 Jan 2010 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/brucewang/articles/308290.html</guid><wfw:comment>http://www.blogjava.net/brucewang/comments/308290.html</wfw:comment><comments>http://www.blogjava.net/brucewang/articles/308290.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/brucewang/comments/commentRss/308290.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/brucewang/services/trackbacks/308290.html</trackback:ping><description><![CDATA[<font size="3"><span style="font-size: 13px; ">最近做的一个功能需要对 List 中的元素进行交换，最开始想到了用 Collections 中的 swap 方法，但后来发现 ECore 模型属性的 unique 是 true，那就肯定是不能用 swap 方法了，因为 Collections 中 swap 的实现使用了 List 的 set 方法<br />
</span></font>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;swap(List</span><span style="color: #000000; ">&lt;?&gt;</span><span style="color: #000000; ">&nbsp;list,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;List&nbsp;l&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;list;<br />
&nbsp;&nbsp;&nbsp;&nbsp;l.set(i,&nbsp;l.set(j,&nbsp;l.get(i)));<br />
}</span></div>
<br />
<span style="font-size: 10pt; ">而 BasicEList 为了保证&nbsp;</span><span  style="font-size: 13px; ">unique 为 true 时列表中元素的唯一性，在 set 方法中做了如下处理</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(isUnique())&nbsp;{<br />
&nbsp;&nbsp; &nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;currentIndex&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;indexOf(object);<br />
&nbsp;&nbsp; &nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(currentIndex&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;currentIndex&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;index)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IllegalArgumentException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">The&nbsp;'no&nbsp;duplicates'&nbsp;constraint&nbsp;is&nbsp;violated</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp; &nbsp;}<br />
}</span></div>
<br />
<span style="font-size: 14pt; "><span style="font-size: 24pt; "><span style="font-size: 12pt; "><span style="font-size: 10pt; ">从上面的代码中可以看出，在 isUnique 返回 true 时，在 EList 的实现类 BasicEList 中，限制了同一对象实例多次出现在 List 中的可能。</span></span></span></span><br />
<br />
<span style="font-size: 10pt; ">那么我们如何才能够在 EList 中完成元素位置的交换呢？其实在 EList 接口中定义了两个 move 方法：</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;Moves&nbsp;the&nbsp;object&nbsp;to&nbsp;the&nbsp;new&nbsp;position,&nbsp;if&nbsp;is&nbsp;in&nbsp;the&nbsp;list.<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;newPosition&nbsp;the&nbsp;position&nbsp;of&nbsp;the&nbsp;object&nbsp;after&nbsp;the&nbsp;move.<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;object&nbsp;the&nbsp;object&nbsp;to&nbsp;move.<br />
</span><span style="color: #008000; ">&nbsp;*/</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;move(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;newPosition,&nbsp;Object&nbsp;object);<br />
<br />
</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;Moves&nbsp;the&nbsp;object&nbsp;from&nbsp;the&nbsp;old&nbsp;position&nbsp;to&nbsp;the&nbsp;new&nbsp;position.<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;newPosition&nbsp;the&nbsp;position&nbsp;of&nbsp;the&nbsp;object&nbsp;after&nbsp;the&nbsp;move.<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;oldPosition&nbsp;the&nbsp;position&nbsp;of&nbsp;the&nbsp;object&nbsp;before&nbsp;the&nbsp;move.<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;the&nbsp;moved&nbsp;object.<br />
</span><span style="color: #008000; ">&nbsp;*/</span><span style="color: #000000; "><br />
Object&nbsp;move(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;newPosition,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;oldPosition);</span></div>
<br />
<span style="font-size: 10pt; ">使用起来很简单：</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">list.move(newPosition,&nbsp;oldPosition);</span></div>
<br />
<span style="font-size: 10pt; ">接下来我们看看 move 是如何实现的：</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Object&nbsp;move(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;targetIndex,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;sourceIndex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">modCount;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;targetIndex&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;size&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IndexOutOfBoundsException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">targetIndex=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;targetIndex<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;size=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;size);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;sourceIndex&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;size&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IndexOutOfBoundsException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">sourceIndex=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;sourceIndex<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;size=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;size);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;object&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;data[sourceIndex];<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;targetIndex&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;sourceIndex&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(&nbsp;targetIndex&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;sourceIndex&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(data,&nbsp;targetIndex,&nbsp;data,&nbsp;targetIndex&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sourceIndex&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;targetIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(data,&nbsp;sourceIndex&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;data,&nbsp;sourceIndex,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetIndex&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;sourceIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assign(targetIndex,&nbsp;object);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;didMove(targetIndex,&nbsp;object,&nbsp;sourceIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;didChange();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;object;<br />
}</span></div>
<br />
<span style="font-size: 10pt; ">代码很清晰，arraycopy 和 assign 完成了元素位置的交换。</span><br />
<br />
<img src ="http://www.blogjava.net/brucewang/aggbug/308290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/brucewang/" target="_blank">都市鸟人</a> 2010-01-05 15:52 <a href="http://www.blogjava.net/brucewang/articles/308290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>