萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

楼主: drach

请问java中如何比较这个数组中的内容

[复制链接]
发表于 2007-12-16 11:10 | 显示全部楼层
原帖由 klsharp 于 2007-12-16 10:00 发表
$frage$ $frage$ 不是很明白为啥一定要从后往前。。。应该都一样吧。。。

从前往后的话,如果当前位置被删掉了,后面所有item的index是不是也相应的发生了变化?
如果你的代码无视这个变化,可以得到正确的结果吗?
并不是说从前往后不行,只是代码写起来应该复杂一些。

[ 本帖最后由 ourgame 于 2007-12-16 11:35 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-16 11:31 | 显示全部楼层
原帖由 ourgame 于 2007-12-16 10:10 发表

从前往后的话,如果当前位置被删掉了,后面所有item的index是不是也相应的发生了变化?
如果你的代码无视这个变化,可以得到正确的结果吗?
并不是说从前往后不行,只是代码写起来应该复杂一些。
我很惊讶 ...


恐怕不能同意这个观点。ArrayList is first of all a List. See the java api doc for ArrayList (the same for List):

public E remove(int index)

    Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-16 11:59 | 显示全部楼层
原帖由 小胖猪猪 于 2007-12-16 10:31 发表
Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).

你引用的说明不正是我说的?你不同意我哪点?

如果
list[0]="aaa"
lsit[1]="bbb"
list[2]="aaa"
list[3]="aaa"
list[4]="ccc"

m=0,n=2
删除list[2]之后,n变成了3,而list[3]其实变成了list[2],换句话说。你漏检查了一个元素。

[ 本帖最后由 ourgame 于 2007-12-16 11:59 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-16 14:22 | 显示全部楼层
原帖由 ourgame 于 2007-12-16 10:59 发表

你引用的说明不正是我说的?你不同意我哪点?

如果
list[0]="aaa"
lsit[1]="bbb"
list[2]="aaa"
list[3]="aaa"
list[4]="ccc"

m=0,n=2
删除list[2]之后,n变成了3,而list[3]其实变成了list[2], ...

同意 "后面所有item的index是不是也相应的发生了变化"这一点。

不同意 反向遍历可以有优势的说法。

个人认为,应该充分运用 java collections framework里面既有的实现,比如雨蝶说的用 Set 的解决方案,或者使用 iterator(参见ListIterator的文档),这样可以写出既简洁又robust的代码。

另外,应该尽量使用interface来访问一个collection而不是它的具体实现,此处来说,ArrayList只不过是List的具体实现(当然知道这个实现跟其他实现的区别,比如说LinkedList,是必要的)。在此处如果通过List interface来访问这个ArrayList,正可以"忽略"元素index发生变化这一个细节。

[ 本帖最后由 小胖猪猪 于 2007-12-16 13:49 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-16 14:28 | 显示全部楼层
原帖由 小胖猪猪 于 2007-12-16 13:22 发表
不同意 反向遍历可以有优势的说法。


优势1:不容易发生lz的这种逻辑错误。
优势2:for (int m=0;m<list.size();m++)
事实上,每次循环的时候,都调用了一次size()。如果循环10次,就要执行10次size()函数。
如果是反向历遍的话,size()函数只调用一次。

楼上的朋友,如果你觉得iterator或者其他方式更稳健和易读,能否贴一下大致的实现代码,我们都可以学习一下?

[ 本帖最后由 ourgame 于 2007-12-16 13:31 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-16 15:11 | 显示全部楼层
优势1:不容易发生lz的这种逻辑错误。

LZ主要是没有区分对象的比较和基本型别的比较

优势2:for (int m=0;m<list.size();m++)
事实上,每次循环的时候,都调用了一次size()。如果循环10次,就要执行10次size()函数。
如果是反向历遍的话,size()函数只调用一次。

有道理,但最好忽略这样细微的性能区别
We should forget about small efficiencies, say about 97% of the time: pre-mature optimization is the root of all evil.  
-- Donald E. Knuth (1974)

楼上的朋友,如果你觉得iterator或者其他方式更稳健和易读,能否贴一下大致的实现代码,我们都可以学习一下?


1.
Set set = new HashSet();
set.addAll(list);
// avoid overhead :D
if(set.size() < list.size()) {
    list.clear();
    list.addAll(set);
}

2.
public void removeDuplicates(Collection items){
  Set found = new HashSet();
  Iterator it = items.iterator();
  while (it.hasNext(){
  if (!found.add(it.next()) it.remove();
}
当然还有不需要HashSet的实现,这些代码未经我测试,但足以交流思想。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-16 17:20 | 显示全部楼层
原帖由 klsharp 于 2007-12-16 10:00 发表
$frage$ $frage$ 不是很明白为啥一定要从后往前。。。应该都一样吧。。。

LinkedList的时候是没区别的。如果是ArrayList的时候,性能上还是有区别的。
如果节点n删掉了。后面m个节点必须copy到前面一格。所以反向操作的话,内存copy量相对少。


原帖由 小胖猪猪 于 2007-12-16 14:11 发表
当然还有不需要HashSet的实现,这些代码未经我测试,但足以交流思想。

明白了。

最后贴一下总结
http://www.blogjava.net/zJun/archive/2007/01/18/94620.html

[ 本帖最后由 ourgame 于 2007-12-16 16:31 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-16 21:14 | 显示全部楼层
原帖由 ourgame 于 2007-12-16 16:20 发表
最后贴一下总结

$ok$
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2007-12-17 14:48 | 显示全部楼层
谢谢楼上几位$支持$ $支持$


修改了一下,还是不行

public void noReTokenList(List<SearchToken> searchTokenList)
    {

    for(int m=0;m<searchTokenList.size();m++)
       {
         SearchToken p= searchTokenList.get(m);
         for(int n=m+1;n<searchTokenList.size();n++)
         {
          SearchToken  q= searchTokenList.get(n);
          if (p.equals(q))
          {   
            searchTokenList.remove(n);
          }
         
         }
       }
    }
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-18 16:30 | 显示全部楼层
原帖由 drach 于 2007-12-17 13:48 发表
谢谢楼上几位$支持$ $支持$


修改了一下,还是不行

public void noReTokenList(List searchTokenList)
    {

    for(int m=0;m

怎么个不行法,具体什么问题?equals是怎样改写的?
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网

GMT+2, 2025-4-25 01:25 , Processed in 0.709677 second(s), 13 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表