日期:2014-05-20  浏览次数:20843 次

帮我看看,这个HashSet里面怎么可以有重复的值
程序的目标是读取一段含有重复单词的字符串,然后程序过滤掉其中的重复的部分,返回一个没有重复单词的字符串,我用了两种方法来做,第一个是没有问题的如下:
public class Test{
public static void main(String[] args){
String str="你好 你好吗 销售 财务 你好 IT CSDN IT";
StringTokenizer st=new StringTokenizer(str);
Set set=new HashSet();
while(st.hasMoreTokens()){
set.add(st.nextToken());
}
StringBuffer sb=new StringBuffer();
for(Iterator i=set.iterator();i.hasNext();){
sb.append((String)i.next()).append(' ');
}

System.out.println(sb.toString());
  }
}
运行结果为:财务 你好吗 你好 CSDN IT 销售 
第二个方法用的是正则表达式
public class TestSplit {

public static void main(String[] args){
String str="你好 你好吗 销售 财务 你好 IT CSDN IT";

Set<String> set=new HashSet<String>();
Pattern p=Pattern.compile("\\b(.+)\\b");
Matcher matcher=p.matcher(str);
matcher.find();
for(int i =0; i<matcher.groupCount();i++){
set.add(matcher.group(i).toString());
}
System.out.println(set);

StringBuffer sb=new StringBuffer();
for(Iterator<String> i=set.iterator();i.hasNext();){
sb.append((String)i.next()).append(' ');
}
System.out.println(sb.toString());
}
}
运行结果为:[你好 你好吗 销售 财务 你好 IT CSDN IT]
你好 你好吗 销售 财务 你好 IT CSDN IT 
也就是HashSet中有重复值,这个是什么情况?


------解决方案--------------------
你的正则有问题,正则默认是贪婪匹配的。所以,你这里等于只匹配了一次,set里只有一个元素,就是“你好 你好吗 销售 财务 你好 IT CSDN IT”

改下正则
Java code
Set<String> set=new HashSet<String>();
        Pattern p=Pattern.compile("\\b(.+?)\\b");
        Matcher matcher=p.matcher(str);
        while(matcher.find()){
            set.add(matcher.group().toString());
        }
        
        System.out.println(set);

------解决方案--------------------
如楼上所说,正则问题,还有个简单方法:String str = "你好 你好吗 销售 财务 你好 IT CSDN IT";

Set<String> set = new HashSet<String>();

String[] values = str.split(" ");
for (String string : values) {
set.add(string);
}
System.out.println(set);