程序的目标是读取一段含有重复单词的字符串,然后程序过滤掉其中的重复的部分,返回一个没有重复单词的字符串,我用了两种方法来做,第一个是没有问题的如下:
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中有重复值,这个是什么情况?

解决方案 »

  1.   

    你的正则有问题,正则默认是贪婪匹配的。所以,你这里等于只匹配了一次,set里只有一个元素,就是“你好 你好吗 销售 财务 你好 IT CSDN IT”改下正则
    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);
      

  2.   

    如楼上所说,正则问题,还有个简单方法: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);
      

  3.   

    重写hashCode()以及equals()方法
    看看。