2013-04-19 3 views
0

Я пишу код для чтения строки и подсчета множества повторяющихсяне может прочитать повторяющиеся символы

public int countRepeatedCharacters() 
{ 
    int c = 0; 
    for (int i = 1; i < word.length() - 1; i++) 
    { 
     if (word.charAt(i) == word.charAt(i + 1)) // found a repetition 
     { 
      if (word.charAt(i - 1) != word.charAt(i)) { 

       c++; 

      } 
     } 
    }  
    return c; 
} 

Если я пытаюсь вход aabbcdaaaabb я должен иметь 4 набора повторяющихся знаков после запятой аа | bb | aaaa | bb

и я знаю, что я не читаю первый набор aa, потому что мой индекс начинается с 1. Я попытался исправить его, чтобы прочитать ноль, но затем я tr, чтобы исправить весь цикл, чтобы работать с изменением, и я потерпел неудачу, есть ли какие-либо советы относительно того, как изменить мой индекс или цикл?

+1

Когда вы нажмете повтор, сохраните символ, чтобы в следующий раз u мог проверить, есть ли у него тот же символ. И начните цикл с 0. –

+0

Ahh, я попробую это, я начну замечать, что я только увеличиваю счет каждый раз в письмах – qvd

ответ

1

Из того, что я понял из вашего вопроса, вы хотите подсчитать количество повторяющихся наборов, то это должно помочь.

for (int i = 0; i < word.length()-1; i++){ 
    if (word.charAt(i) == word.charAt(i + 1)){ // found a repetition 
     if (i==0 || word.charAt(i - 1) != word.charAt(i)) {  
      c++;  
     } 
    } 
} 
+0

Ahh, для вашего второго оператора if вы устанавливаете index = 0? Не знал, что я могу это сделать! – qvd

+0

@qvd я не установил индекс, его проверили, чтобы избежать ArrayIndexOutOfBounds: (i-1), когда i = 0 – Ankit

+0

благодарю вас или информацию! – qvd

0

Вы можете попробовать что-то вроде этого: -

public static void main(String str[]) { 
    String word = "aabbcdaaaabbc"; 
    int c = 1; 
    for (int i = 0; i < word.length() - 1; i++) { 
     if (word.charAt(i) == word.charAt(i + 1)) { 
      c++; 
     } else { 
      System.out.println(word.charAt(i)+ " = " +c); 
      c = 1; 
     } 
    } 
    System.out.println(word.charAt(word.length()-1)+ " = " +c); 
} 

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

+0

Большое спасибо, это не сработало бы для строк без повторяющихся букв, хотя это помогло! – qvd

+0

Это было бы! Он будет давать '1', как подсчет повторений. Попробуйте для строки сказать 'test' & дайте мне знать, если это работает или нет! – SudoRahul

+1

О, я вижу! Это справедливо, спасибо! – qvd

0

Использование length() -1 заставляет вас не учитывать последний символ в ваших расчетах. Это заставляет вас потерять последний повторяющийся символ.

Наконец, я сделал бы это следующим образом:

public static int countRepeatedCharacters(String word) 
    { 
     boolean withinRepeating = false; 
     int c = 0; 

     for (int i = 1; i < word.length(); i++) 
     { 

      if (!withinRepeating && (withinRepeating = word.charAt(i) == word.charAt(i - 1))) 
      c++;       
      else 
      withinRepeating = word.charAt(i) == word.charAt(i - 1); 
     }  
     return c; 
    } 
1

Попробуйте этот код:

public int countRepeatedCharacters(String word) 
{ 
    int c = 0; 
    Character last = null; 
    bool counted = false; 
    for (int i = 0; i < word.length(); i++) 
    { 
     if (last != null && last.equals(word.charAt(i))) { // same as previous characted 
      if (!counted) { // if not counted this character yet, count it 
       c++; 
       counted = true; 
      } 
     } 
     else {  // new char, so update last and reset counted to false 
      last = word.charAt(i); 
      counted = false 
     } 
    }  
    return c; 
} 

Edit - подсчитанное AAAA как 4, закрепленное считать, как 1

1

Попробуйте это ----

public int countRepeatedCharacters() 
{ 
    int c = 0,x=0; 
    boolean charMatched=false; 
    for (int i = 0; i < word.length(); i++) 
    { 
     if(i==word.length()-1) 
     { 
      if (word.charAt(i-1) == word.charAt(i)) 
       c++; 
      break; 
     } 
     if (word.charAt(i) == word.charAt(i + 1)) // found a repetition 
     { 

      charMatched=true; 
      continue; 
     } 
     if(charMatched==true) 
     c++; 
     charMatched=false;   
    }  
    return c; 
} 
+0

Не могли бы вы переименовать 'флаг' немного более значимым. thx;) –

+0

означает, что либо два совпадающих символа совпадают, либо нет. –

1

Попробуйте этот метод. Он учитывает множество повторяющихся характеристик.

public static void main(String[] args) { 
    String word = "aabbcdaaaabbc"; 
    int c = 0; 
    for (int i = 0; i < word.length()-1; i++) { 

     // found a repetition 
     if (word.charAt(i) == word.charAt(i + 1)) { 
      int k = 0; 
      while((i + k + 1) < word.length()) { 
       if(word.charAt(i+k) == word.charAt(i + k + 1)) { 
        k++; 
        continue; 
       } 
       else { 
        break; 
       } 
      } 
      c++; 
      i+=k-1; 
     } 
    } 
    System.out.println(c); 
}