drach 发表于 2007-12-14 17:18

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

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


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

也就是说这个数组被限定为 SearchToken的形式,现在想比较数组,请问该如何表达呢,我写的编译不通过,因为数组形式不对,不能用简单的a来表示数组首地址
for(int m=0;m<searchTokenList.size();m++)
            
            {
         for(int n=0;n<searchTokenList.size();n++)
         { if (searchTokenList==searchTokenList)
         {   
             generator.searchTokenList.remove(m);
         }
         }
}

klsharp 发表于 2007-12-14 17:46

1.ARRAYLIST必须要用GET(I)来返回第I位置的元素
2.你定义的类有3个变量,你必须定义什么叫"对象A等于对象B"

drach 发表于 2007-12-14 18:40

原帖由 klsharp 于 2007-12-14 16:46 发表 http://www.dolc.de/forum/images/common/back.gif
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);
            SearchTokenq= searchTokenList.get(n);
         if (p==q)
         {   
             searchTokenList.remove(n);
         }
         
         }
}


编译成功,可重复的内容还在:(

klsharp 发表于 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???

drach 发表于 2007-12-14 20:26

原帖由 klsharp 于 2007-12-14 18:27 发表 http://www.dolc.de/forum/images/common/back.gif
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,我的程序不是多删,就是少删$汗$

klsharp 发表于 2007-12-14 21:07

被你越搞越糊涂了, 你这个程序删除的是SearchToken的对象,SearchToken的对象包含3个变量,你要让系统知道什么情况才是所谓的“一样”,所以你要么写一个boolean isgleich(SearchToken a)方法来判断2个SearchToken是否相等,然后在IF语句里调用,要么就向我给你那样在IF语句里写明你究竟要比较哪个变量来判断两个SearchToken是一样的

小胖猪猪 发表于 2007-12-14 21:31

f (p==q)

lz想比较两个对象。

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

[ 本帖最后由 小胖猪猪 于 2007-12-14 20:35 编辑 ]

雨蝶 发表于 2007-12-16 01:00

你可以重写SearchToken类的equals方法,然后用Set而非List

ourgame 发表于 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 编辑 ]

klsharp 发表于 2007-12-16 11:00

$frage$ $frage$ 不是很明白为啥一定要从后往前。。。应该都一样吧。。。

ourgame 发表于 2007-12-16 11:10

原帖由 klsharp 于 2007-12-16 10:00 发表 http://www.dolc.de/forum/images/common/back.gif
$frage$ $frage$ 不是很明白为啥一定要从后往前。。。应该都一样吧。。。
从前往后的话,如果当前位置被删掉了,后面所有item的index是不是也相应的发生了变化?
如果你的代码无视这个变化,可以得到正确的结果吗?
并不是说从前往后不行,只是代码写起来应该复杂一些。

[ 本帖最后由 ourgame 于 2007-12-16 11:35 编辑 ]

小胖猪猪 发表于 2007-12-16 11:31

原帖由 ourgame 于 2007-12-16 10:10 发表 http://www.dolc.de/forum/images/common/back.gif

从前往后的话,如果当前位置被删掉了,后面所有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).

ourgame 发表于 2007-12-16 11:59

原帖由 小胖猪猪 于 2007-12-16 10:31 发表 http://www.dolc.de/forum/images/common/back.gif
Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).
你引用的说明不正是我说的?你不同意我哪点?

如果
list="aaa"
lsit="bbb"
list="aaa"
list="aaa"
list="ccc"

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

[ 本帖最后由 ourgame 于 2007-12-16 11:59 编辑 ]

小胖猪猪 发表于 2007-12-16 14:22

原帖由 ourgame 于 2007-12-16 10:59 发表 http://www.dolc.de/forum/images/common/back.gif

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

如果
list="aaa"
lsit="bbb"
list="aaa"
list="aaa"
list="ccc"

m=0,n=2
删除list之后,n变成了3,而list其实变成了list, ...
同意 "后面所有item的index是不是也相应的发生了变化"这一点。

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

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

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

[ 本帖最后由 小胖猪猪 于 2007-12-16 13:49 编辑 ]

ourgame 发表于 2007-12-16 14:28

原帖由 小胖猪猪 于 2007-12-16 13:22 发表 http://www.dolc.de/forum/images/common/back.gif
不同意 反向遍历可以有优势的说法。

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

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

[ 本帖最后由 ourgame 于 2007-12-16 13:31 编辑 ]

小胖猪猪 发表于 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的实现,这些代码未经我测试,但足以交流思想。

ourgame 发表于 2007-12-16 17:20

原帖由 klsharp 于 2007-12-16 10:00 发表 http://www.dolc.de/forum/images/common/back.gif
$frage$ $frage$ 不是很明白为啥一定要从后往前。。。应该都一样吧。。。
LinkedList的时候是没区别的。如果是ArrayList的时候,性能上还是有区别的。
如果节点n删掉了。后面m个节点必须copy到前面一格。所以反向操作的话,内存copy量相对少。


原帖由 小胖猪猪 于 2007-12-16 14:11 发表 http://www.dolc.de/forum/images/common/back.gif
当然还有不需要HashSet的实现,这些代码未经我测试,但足以交流思想。
明白了。

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

[ 本帖最后由 ourgame 于 2007-12-16 16:31 编辑 ]

小胖猪猪 发表于 2007-12-16 21:14

原帖由 ourgame 于 2007-12-16 16:20 发表
最后贴一下总结
$ok$

drach 发表于 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++)
         {
          SearchTokenq= searchTokenList.get(n);
          if (p.equals(q))
          {   
            searchTokenList.remove(n);
          }
         
         }
       }
    }

小胖猪猪 发表于 2007-12-18 16:30

原帖由 drach 于 2007-12-17 13:48 发表 http://www.dolc.de/forum/images/common/back.gif
谢谢楼上几位$支持$ $支持$


修改了一下,还是不行

public void noReTokenList(List searchTokenList)
    {

    for(int m=0;m
怎么个不行法,具体什么问题?equals是怎样改写的?

klsharp 发表于 2007-12-18 16:43

俺估计。。。LZ压根没改写EQUALS。。。。

ourgame 发表于 2007-12-18 18:01

他的问题就是因为正向历遍的问题。我在13楼说的很清楚了。
包括17楼贴的链接。里面提到的方法,他一个都没用。
无语……LZ根本没仔细看回帖。

drach 发表于 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$汗$ ,正反遍历我觉得无所谓吧,不至于差别那么大

klsharp 发表于 2007-12-18 20:00

怎么写的这么晕啊。。。。
你就
public boolean equals(SearchToken a) {
return (id==a.getId())
}
不就完了

[ 本帖最后由 klsharp 于 2007-12-18 19:38 编辑 ]
页: [1]
查看完整版本: 请问java中如何比较这个数组中的内容