2013-11-01 6 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 на каждой итерации, и в последней итерации у вас есть как i, так и j, указывающие на одно и то же местоположение, чтобы он никогда не печатал последний символ. Попробуйте unleass вы хотите использовать регулярное выражение для того чтобы достигнуть этого:

EDIT:

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) t используйте '+ =' оператор в цикле по результату Строки, вместо этого создайте 'StringBuilder' перед циклом и' append (дополнительнаяPart) 'к нему внутри цикла. Затем вы можете получить результат с помощью метода toString. – Pshemo

32

Вы можете использовать регулярные выражения для этого.

Например:

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

Выход:

done 

шаблон Объяснение:

  • "(.)\\1{1,}" означает любой символ (добавляется к группе 1), а затем сам по себе по крайней мере один раз
  • "$1" рефери ces содержание группы 1
+1

Ugh; Ты подтолкнул меня на это. [Java Regex Tutorial] (http://www.vogella.com/articles/JavaRegularExpressions/article.html) содержит хорошее объяснение того, как использовать регулярное выражение. – Justin

+2

Nice regex, но почему '{1,}', если вы можете использовать '+'? – Pshemo

+1

спасибо, к сожалению, нам все еще не разрешено использовать такие выражения, мне нужно придерживаться цикла for. но отличная информация, я добавлю его в мои заметки :) – abedzantout

-1

больше удовольствия с Java 7:

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

Нет более загадочные цифры в регулярных выражениях.

+0

ОП сказал: «без использования регулярных выражений», поэтому это решение не является ответом на вопрос. Кроме того, решение неверно, потому что оно заменило бы «nonono» на «no». – Chriki

0

Если вы не можете использовать замену или 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 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; 
} 
+1

Это неправильное решение. Он не только удаляет повторяющиеся _adjacent_ символы. Например, «meeeekeee» становится «mek». – Chriki

+0

Можете ли вы рассказать о том, почему вы считаете, что это хороший ответ, а perhap объяснить, что предлагает предлагаемое решение? –

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; 
} 
Смежные вопросы