2013-11-01 89 views
1

我需要编写一个静态方法,它将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; 
    } 
} 
+0

尝试正则表达式 – lavrik

+0

如何才能'str.charAt(i)!= str.charAt(j)'是真的吗? –

+0

@lavrik因为它看起来像介绍的东西,我怀疑提问者知道如何使用正则表达式... – ryanlutgen

回答

0

问题在于您的情况。你说在每次迭代中比较i和i + 1,并且在上一次迭代中,我和j都指向相同的位置,所以它不会打印最后一个字符。尽量要使用正则表达式来实现这一目标本unleass:

编辑:

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); 
    } 
3

可能:

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

+1,也许你应该指出有什么不同 – Cruncher

+0

它给了我一个错误,除非我用str.lenthg()取代str.lenthg() - 1 – abedzantout

+0

1)字符的索引从'0'到'length-1'2)如果你添加的结果只有两个不相等的左边字符,那么如果是'“abb”'你会跳过''b“'3)在结果字符串中循环使用'+ ='运算符,而不是在循环之前创建'StringBuilder',并在循环内部追加(additionalPart)'。然后你可以使用'toString'方法得到结果。 – Pshemo

32

你可以使用正则表达式为。

例如:

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

输出:

done 

模式说明:

  • "(.)\\1{1,}"指任何字符(加入到组1),随后本身至少一次
  • "$1"参考文献ces组1的内容
+1

呃;你打败了我。 [Java正则表达式教程](http://www.vogella.com/articles/JavaRegularExpressions/article.html)对如何使用正则表达式有很好的解释。 – Justin

+2

不错的正则表达式,但为什么'{1,}'如果你可以使用'+'呢? – Pshemo

+1

谢谢,不幸的是,我们仍然不允许使用这样的表达式,我需要坚持for循环。但伟大的信息,我会将它添加到我的笔记:) – abedzantout

-1

更多乐趣与Java 7:

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

在正则表达式没有更多的神秘数字。

+0

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

0

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

输入: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(); 
} 
-2

公共静态字符串removeDuplicates(字符串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; 
} 
+1

此解决方案不正确。它不仅删除重复的_adjacent_字符。例如,“meeeekeee”变成“mek”。 – Chriki

+0

你可以扩展你为什么认为这是一个很好的答案,并说明解决方案正在做什么? –

0
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); 
    } 
} 
+0

你可以解释你的代码,而不是仅仅在这里抛弃它。这也是过于复杂---为什么2循环,为什么一个'StringBuffer'和删除,而不是复制非重复的字符? – Robert

0

输入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; 
}