找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

查看: 3192|回复: 23

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

[复制链接]
发表于 2007-12-14 17:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

×
ArrayList<SearchToken> searchTokenList = new ArrayList<SearchToken>();


想比较searchTokenList数组中的内容,因为这个数组中存放了相同的string内容,
searchToken 形式如下
SearchToken(String id, String token, boolean isCaseSensitive)

也就是说这个数组被限定为 SearchToken的形式,现在想比较数组,请问该如何表达呢,我写的编译不通过,因为数组形式不对,不能用简单的a[0]来表示数组首地址
for(int m=0;m<searchTokenList.size();m++)
            
            {
           for(int n=0;n<searchTokenList.size();n++)
           { if (searchTokenList[m]==searchTokenList[n])
           {   
             generator.searchTokenList.remove(m);
           }
           }
}
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-12-14 17:46 | 显示全部楼层
1.ARRAYLIST必须要用GET(I)来返回第I位置的元素
2.你定义的类有3个变量,你必须定义什么叫"对象A等于对象B"
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-14 18:40 | 显示全部楼层
原帖由 klsharp 于 2007-12-14 16:46 发表
1.ARRAYLIST必须要用GET(I)来返回第I位置的元素
2.你定义的类有3个变量,你必须定义什么叫"对象A等于对象B"



for(int m=0;m<=searchTokenList.size();m++)
         {
           for(int n=0;n<searchTokenList.size();n++)
           {SearchToken p= searchTokenList.get(m);
            SearchToken  q= searchTokenList.get(n);
           if (p==q)
           {   
             searchTokenList.remove(n);
           }
           
           }
}


编译成功,可重复的内容还在:(
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2007-12-14 19:27 | 显示全部楼层
wieso so kompliziert,schreib einfach so:
if (searchTokenList.get(m).id==searchTokenList.get(n).id) (Fall die Gleichheit hier bedeutet die ID von beide Objekten gleich sind!).

Aber was bedeutet zwei SearchTokeen gleich??????,
entwede ID von beiden gleich sind oder A.TOKEN==B.TOKEN???
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-14 20:26 | 显示全部楼层
原帖由 klsharp 于 2007-12-14 18:27 发表
wieso so kompliziert,schreib einfach so:
if (searchTokenList.get(m).id==searchTokenList.get(n).id) (Fall die Gleichheit hier bedeutet die ID von beide Objekten gleich sind!).

Aber was bedeute ...


searchTokenList这个数组里面存的是一个算法找到的token,token属性为<SearchToken>,但它们有重复的,我的目的就是删除这些重复的token,我的程序不是多删,就是少删$汗$
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2007-12-14 21:07 | 显示全部楼层
被你越搞越糊涂了, 你这个程序删除的是SearchToken的对象,SearchToken的对象包含3个变量,你要让系统知道什么情况才是所谓的“一样”,所以你要么写一个boolean isgleich(SearchToken a)方法来判断2个SearchToken是否相等,然后在IF语句里调用,要么就向我给你那样在IF语句里写明你究竟要比较哪个变量来判断两个SearchToken是一样的
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2007-12-14 21:31 | 显示全部楼层
f (p==q)


lz想比较两个对象。

要分清楚 对象的比较(参见equals 或 compareTo) 跟 基本型别的比较(用 ==, !=, <, >) 这两个概念的区别,前面已经有人指出来这一点了(见 klsharp 说的 isgleich())。

[ 本帖最后由 小胖猪猪 于 2007-12-14 20:35 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2007-12-16 01:00 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2007-12-16 05:26 | 显示全部楼层
  • k兄说的是对的,你应该定义一个SearchToken.equals(...)来比较。用==只是比较对象指针是否相同。
    .
  • 你直接删除list中“多余”的对象,所以应该反向删除,而不是从0到size。好处你慢慢体会吧

       for (int m = size()-1; m >= 1; m--)
        {
                String s1 = list.get(m);
                for (int n = m-1; n >= 0; n--)
                {
                        if (list.get(n).equals(s1)) //equals需要你在SearchToken类中定义
                        {
                                list.remove(m);
                                break;
                        }
                }
        }

[ 本帖最后由 ourgame 于 2007-12-16 13:34 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2007-12-16 11:00 | 显示全部楼层
$frage$ $frage$ 不是很明白为啥一定要从后往前。。。应该都一样吧。。。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 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.
回复 支持 反对

使用道具 举报

发表于 2007-12-18 16:43 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2007-12-18 18:01 | 显示全部楼层
他的问题就是因为正向历遍的问题。我在13楼说的很清楚了。
包括17楼贴的链接。里面提到的方法,他一个都没用。
无语……LZ根本没仔细看回帖。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-18 18:26 | 显示全部楼层
public boolean equals(Object obj) {
                boolean flag = false;
                if(obj instanceof SearchToken){
                        this.getId().equals((((SearchToken) obj).getId()));       
                        flag = true;
                }
               
                return flag;
        }
改写的equals$汗$ ,正反遍历我觉得无所谓吧,不至于差别那么大
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2007-12-18 20:00 | 显示全部楼层
怎么写的这么晕啊。。。。
你就
public boolean equals(SearchToken a) {
  return (id==a.getId())
}
不就完了

[ 本帖最后由 klsharp 于 2007-12-18 19:38 编辑 ]
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-7-8 23:56 , Processed in 0.106909 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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