【问题标题】:Remove repeated characters in a string删除字符串中的重复字符
【发布时间】:2013-11-12 21:01:10
【问题描述】:

我需要编写一个静态方法,该方法将String 作为参数并返回一个新的String,该方法是通过用该字母的单个实例替换重复相邻字母的每个实例而不使用正则表达式而获得的。例如,如果我输入“maaaakkee”作为String,它会返回“make”。 我已经尝试了以下代码,但它似乎没有显示最后一个字符。 这是我的代码:

import java.util.Scanner;
public class undouble {
    public static void main(String [] args){
        Scanner console = new Scanner(System.in);
        System.out.println("enter String: ");
        String str = console.nextLine();
        System.out.println(removeSpaces(str));
    }
public static String removeSpaces(String str){
    String ourString="";
    int j = 0;
    for (int i=0; i<str.length()-1 ; i++){
        j = i+1;
        if(str.charAt(i)!=str.charAt(j)){
            ourString+=str.charAt(i);
        }

    }

    return ourString;
    }
}

【问题讨论】:

  • 试试正则表达式
  • str.charAt(i)!=str.charAt(j) 怎么可能是真的?
  • @lavrik 因为它看起来像是介绍性的东西,我怀疑提问者知道如何使用正则表达式......
  • 问题的第一个字母大写,即使它出现四个单词,这表明这是课程作业的复制和粘贴。
  • @Vizkos 这可能是开始学习的原因:)

标签: java string replace


【解决方案1】:

您可以为此使用正则表达式。

例如:

String input = "ddooooonnneeeeee";
System.out.println(input.replaceAll("(.)\\1{1,}", "$1"));

输出:

done

模式解释:

  • "(.)\\1{1,}" 表示任何字符(添加到第 1 组)后跟至少一次
  • "$1"引用第一组的内容

【讨论】:

  • 呃;你打败了我。 Java Regex Tutorial 很好地解释了如何使用正则表达式。
  • 不错的正则表达式,但如果可以使用+,为什么还要{1,}
  • 谢谢,很遗憾,我们仍然不允许使用这样的表达式,我需要坚持 for 循环。但是很好的信息我会把它添加到我的笔记中:)
  • @Predator44 不客气!很抱歉听到你不能使用它:(
  • @Pshemo 谢谢。顺便说一句,您完全可以使用+。不知道为什么我转而使用{1,},但好吧,我猜在这种情况下它是等效的。
【解决方案2】:

也许:

for (int i=1; i<str.length() ; i++){
    j = i+1;
    if(str.charAt(i)!=str.charAt(j)){
        ourString+=str.charAt(i);
    }
}

【讨论】:

  • 它给我一个错误,除非我用 str.lenthg()-1 替换 str.lenthg()
  • 1) 字符的索引从 0length-1 2) 如果您只添加两个不相等的左侧字符,那么如果 "abb" 您将跳过 "b" 3) 不要在结果字符串的循环中使用+= 运算符,而是在循环前创建StringBuilder 并在循环内创建append(additionalPart)。然后你可以使用toString 方法得到结果。
【解决方案3】:

问题在于你的情况。你说在每次迭代中比较 i 和 i+1 ,在最后一次迭代中你 i 和 j 都指向同一个位置,所以它永远不会打印最后一个字符。试试这个,除非你想使用正则表达式来实现这个:

编辑:

public  void removeSpaces(String str){
        String ourString="";
        for (int i=0; i<str.length()-1 ; i++){
            if(i==0){
                ourString = ""+str.charAt(i);
            }else{
                if(str.charAt(i-1) != str.charAt(i)){
                    ourString = ourString +str.charAt(i);
                }
            }           
        }
        System.out.println(ourString);
    }

【讨论】:

【解决方案4】:

如果您不能使用replace 或replaceAll,这里有一个替代方法。 O(2n),O(N) 用于库存,O(N) 用于创建字符串。它删除字符串中所有重复的字符,将它们放入字符串生成器中。

输入:abcdef,输出:abcdef

输入:aabbcdeef,输出:cdf

private static String remove_repeated_char(String str)
{
    StringBuilder result = new StringBuilder();
    HashMap<Character, Integer> items = new HashMap<>();

    for (int i = 0; i < str.length(); i++)
    {
        Character current = str.charAt(i);
        Integer ocurrence = items.get(current);
        if (ocurrence == null)
            items.put(current, 1);
        else
            items.put(current, ocurrence + 1);
    }

    for (int i = 0; i < str.length(); i++)
    {
        Character current = str.charAt(i);
        Integer ocurrence = items.get(current);
        if (ocurrence == 1)
            result.append(current);
    }
    return result.toString();
}

【讨论】:

    【解决方案5】:
    import java.util.*;
    public class string2 {
    
        public static void main(String[] args) {
    
            //removes repeat character from array
            Scanner sc=new Scanner(System.in);
            StringBuffer sf=new StringBuffer();
            System.out.println("enter a string");
            sf.append(sc.nextLine());
            System.out.println("string="+sf);
            int i=0;
    
            while( i<sf.length())
            {
                int j=1+i;
                while(j<sf.length())
                {   
    
                    if(sf.charAt(i)==sf.charAt(j))
                    {
                        sf.deleteCharAt(j);
                    }
                    else
                    {
                        j=j+1;
                    }
                }
                i=i+1;
            }
    
            System.out.println("string="+sf);
        }
    }
    

    【讨论】:

    • 你可以解释你的代码,而不是把它扔在这里。它也过于复杂 --- 为什么是 2 个循环,为什么是 StringBuffer 并删除而不是复制非重复字符?
    【解决方案6】:

    输入 AABBBccDDD,输出 BD 输入 ABBCDDA,输出 C

        private String reducedString(String s){
        char[] arr = s.toCharArray();
        String newString = "";
        Map<Character,Integer> map = new HashMap<Character,Integer>();
        map.put(arr[0],1);
        for(int index=1;index<s.length();index++)
        {
            Character key = arr[index];   
            int value;
            if(map.get(key) ==null)
            {
                value =0;
            }
            else 
            {
                value = map.get(key);
            }
    
            value = value+1;
            map.put(key,value);
        }
        Set<Character> keyset = map.keySet();
    
        for(Character c: keyset)
        {
            int value = map.get(c);
    
            if(value%2 !=0)
            {
                newString+=c;
            }
        }
    
        newString = newString.equals("")?"Empty String":newString;
        return newString;
    }
    

    【讨论】:

      【解决方案7】:
      public class RemoveDuplicateCharecterInString {
          static String input = new String("abbbbbbbbbbbbbbbbccccd");
          static String output = "";
          public static void main(String[] args)
       {
              // TODO Auto-generated method stub
      
              for (int i = 0; i < input.length(); i++) {
                  char temp = input.charAt(i);
                  boolean check = false;
      
                  for (int j = 0; j < output.length(); j++) {
                      if (output.charAt(j) == input.charAt(i)) {
                          check = true;
                      }
                  }
                  if (!check) {
                      output = output + input.charAt(i);
                  }
              }
              System.out.println("  " + output);
          }
      }
      

      答案:abcd

      【讨论】:

        【解决方案8】:
        public class RepeatedChar {
        
            public static void main(String[] args) {
                String rS = "maaaakkee";
                String outCome= rS.charAt(0)+"";
                int count =0;
                char [] cA =rS.toCharArray();
                for(int i =0; i+1<cA.length; ++i) {
                    if(rS.charAt(i) != rS.charAt(i+1)) {
                        outCome += rS.charAt(i+1);
                    }
                }
        
                System.out.println(outCome);
            }
        
        }
        

        【讨论】:

          【解决方案9】:

          编写删除重复字符的 JAVA 程序:

          package replace;
          
          public class removingrepeatedcharacters 
          
          {
          
          public static void main(String...args){
                  int i,j=0,count=0;
          
                  String str="noordeen";
                  String str2="noordeen";
                  char[] ch=str.toCharArray();
                  for(i=0;i<=5;i++)
                  {
                      count=0;
                      for(j=0;j<str2.length();j++)
                      {
                      if(ch[i]==str2.charAt(j))
                      {
                          count++;
                          System.out.println("at the index "+j +"position  "+ch[i]+    "+ count is"+count);
                          if(count>=2){
                              str=str2;
                              str2=str.replaceFirst(Character.toString(ch[j]),Character.toString(' '));
                      }
          
                          System.out.println("after replacing    "          +str2);   
          
                      }
          
                      }
          
          
          
          
                  }
          
              }
          
          }
          

          【讨论】:

            【解决方案10】:
            String outstr = "";
            String outstring = "";
            for(int i = 0; i < str.length() - 1; i++) {
                if(str.charAt(i) != str.charAt(i + 1)) {
                    outstr = outstr + str.charAt(i);
                }
                outstring = outstr + str.charAt(i);         
            }
            System.out.println(outstring);
            

            【讨论】:

            • 请不要只发布一些代码作为答案,还要解释为什么此代码有效(与问题相反)
            【解决方案11】:
            public static void remove_duplicates(String str){
                String outstr="";
                String outstring="";
                for(int i=0;i<str.length()-1;i++) {
                if(str.charAt(i)!=str.charAt(i+1)) {
                    outstr=outstr+str.charAt(i);
                    }
                    outstring=outstr+str.charAt(i);
                    }
                    System.out.println(outstring);
                }
            

            【讨论】:

              【解决方案12】:

              使用 java 7 更有趣:

              System.out.println("11223344445555".replaceAll("(?<nums>.+)\\k<nums>+","${nums}"));
              

              正则表达式中不再有神秘数字。

              【讨论】:

              • OP 说,“不使用正则表达式”,所以这个解决方案不是问题的答案。除此之外,该解决方案是错误的,因为它会将“nonono”替换为“no”。
              【解决方案13】:

              public static String removeDuplicates(String str) {

                  String str2 = "" + str.charAt(0);
                  for (int i = 1; i < str.length(); i++) {
                      if (str.charAt(i - 1) == str.charAt(i) && i != 0) {
                          continue;
                      }
                      str2 = str2 + str.charAt(i);
                  }
                  return str2;
              }
              

              【讨论】:

              • 此解决方案不正确。它不仅删除重复的 adjacent 字符。例如,“meeeeeee”变成了“mek”。
              • 您能否详细说明为什么您认为这是一个很好的答案,或者解释一下提议的解决方案在做什么?
              猜你喜欢
              • 1970-01-01
              • 2020-03-30
              • 1970-01-01
              • 2012-04-08
              • 1970-01-01
              • 1970-01-01
              • 2018-02-20
              • 2012-05-09
              相关资源
              最近更新 更多