从String数组中仅删除一个重复单词的频率

时间:2014-06-23 06:14:16

标签: java string

我有一个字符串数组

String a = "This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty.";

String a1[]=a.split(" ");
for(String temp: a1)
{
    System.out.println(temp);
}

这里“生命”重复三次。现在我只需删除一个重复的单词形式数组的频率。

请指导我......

感谢。

4 个答案:

答案 0 :(得分:2)

你可以使用这样的东西,但这只会删除指定单词的第一次出现:

删除一个副本的完整代码。你需要知道它不会忽略特殊字符,在这种情况下空格是分隔符。

public static void main(String []args){
     String a = "This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty Mitty";
     System.out.println(removeOneDuplicate(a));
}

public static String removeOneWord(String str, String word){
    int value = str.indexOf(word);
    String result = str.substring(0, value);
    result += str.substring( value+word.length(), str.length());
    return result;
}

public static String removeOneDuplicate(String a){
    String [] tmp = a.split(" ");
     Map<String, Integer> map = new HashMap<String, Integer>();
     for(String s: tmp){
         if( map.containsKey(s)){
            int value = map.get(s); 
            if(value == 1)
                a = removeOneWord(a, s);
             map.put(s, value + 1);
         }
         else
             map.put(s, 1);
     }
     return a;
}

示例结果:

INPUT: This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty Mitty
OUTPUT: This is a  and our life will be full  fun just like the Benn Steller's Secret life of Walter  Mitty

结果您可以看到lifeofMitty已被删除。

修改

如果你想删除所有重复项并在第一行后面出现单词更改:

int value = str.indexOf(word); - &gt; int value = str.lastIndexOf(word);

int value = map.get(s); 
if(value == 1)
    a = removeOneWord(a, s);
map.put(s, value + 1);

为:

a = removeOneWord(a, s);

答案 1 :(得分:0)

首先,您提供的示例不是String数组。它是一个字符串。

我正在提供基于String的解决方案。如果您需要String数组,如果您理解这一点,则可以自己完成。

首先,让我们拿一个字符串标记器。标记生成器按给定的字符集拆分字符串。在最简单的形式中,它通过空间分解字符串。 例如,字符串str =“这是一个测试”。一个简单的标记化器会将这个字符串分解为“This”“is”“a”“test”等字样。

以下是声明和使用tokenizer的代码:

StringTokenizer st = new StringTokenizer(a); // a is given your string

现在,我们在下面声明一个字符串数组。 (字符串数组是一个数组,每个数组的元素都是一个字符串。)

String[] str_arr = new String[100];

我们现在将使用tokenizer来获取字符串中的每个单词,并将每个单词保留在字符串数组中,如下所示:

int index=0; // to keep track of index of the array (of strings)

while (st.hasMoreElements()) {
  str_arr[index] = (String) st.nextElement();
  index++;
}

所以,现在我们有一个名为'str_arr'的字符串数组。现在我们将检查数组的每个元素是否发生重复值。如果我们发现重复,我们将用空值替换它。但是,我们只会这样做一次。其余的副本将保持不变,这就是你要求的,对吧?

要跟踪已经搜索过的字符串并使其为null,我们将使用这样的HashMap。

HashMap<String, Integer> hash_map = new HashMap<String, Integer>();

现在,我们将运行2个嵌套循环,之后,我们将有一个修改过的数组,其中只有多次出现的字符串减少了1。

for(int i=0; i<index; i++){

            String current_string = str_arr[i];

            for(int j=i+1; j<index; j++){
                if( (current_string.equals(str_arr[j])) && (hash_map.containsKey(current_string)==false) && str_arr[j]!=""){
                    hash_map.put(str_arr[j], 1);
                    str_arr[j]="";
                    break;
                }

            }
        }

现在,您可以打印所有单词,如下所示:

for(int i=0; i<index; i++)
System.out.print(str_arr[i]+" ");

INPUT: This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty.
OUTPUT: This is a life and our  will be full of fun just like the Benn Steller's Secret life  Walter Mitty. 

很抱歉很长的解释,但如果你不能得到任何意见,请发表评论。我会尽力回复。 谢谢! 快乐编码:)

答案 2 :(得分:0)

众所周知,set根本不包含重复。

我的代码:

 String a = "This is a life and our life will be full of fun just like the Benn     Steller's Secret life of Walter Mitty.";
        String[] aSpilt = a.split(" ");

        List<String> list = Arrays.asList(aSpilt);
        System.out.print("The input is : ");
        list.forEach((s) -> System.out.print(s + " "));
        System.out.println();
        Set<String> noDuplicateSet = new LinkedHashSet<>();
        Set<String> duplicateSet = new LinkedHashSet<>();

        list.forEach((i) -> {
            if (!noDuplicateSet.add(i) && i.equals("life")) {
                duplicateSet.add(i + " ");
            }
        });
        System.out.print("The output is : ");
        noDuplicateSet.forEach((s) -> System.out.print(s + " "));
        System.out.println("");
        duplicateSet.forEach((s) -> System.out.print(s + " "));

我的输出:

The input is : This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty. 
The output is : This is a life and our will be full of fun just like the Benn Steller's Secret Walter Mitty

注意:

  1. 我保留了第一次生命并移除了剩下的部分,而且我遇到了不止一次,因为这个问题只是为了保住第一次生命而去掉其余部分。

  2. 我使用lambda表达式来遍历集合

  3. 来源:

    1. http://www.programcreek.com/2013/03/hashset-vs-treeset-vs-linkedhashset/

    2. http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

答案 3 :(得分:0)

public static void main(String args[])
{
    String  s;
    Scanner in=new Scanner(System.in);
    s=in.nextLine();
    String ch[]=s.split(" ");
    String m=in.nextLine();
    for(int i=;i<ch.length;i++)
    {
        if(ch[i].matches(m))
            ch[i]="";

        S.o.p(ch[i]);
    }
}