Разбор строки и замена букв Java - PullRequest
0 голосов
/ 17 декабря 2011

При вводе у меня есть какая-то строка: «сегодня идет снег знаю», здесь у меня есть 3 слова, поэтому я должен разобрать их следующим образом: каждый символ должен сравниваться со всеми другими символами, и суммировать, сколько этих символов онислова имеют, например, пример для буквы «о» будет 2 (от «сегодня» и «идет снег») или буква «W» будет 2 (от «знать» и «идет снег»).После этого я должен заменить эти символы числом (преобразованным в формат char) букв.Результат должен быть «13111 133211 1332».

Что я сделал?

Сначала я записываю на пленку некоторые слова и

    public void inputStringsForThreads () {

       boolean flag;

            do {

    // will invite to input 
                stringToParse = Input.value();   

                try {

                flag = true;

    // in case that found nothing , space , number and other special character , throws an exception
                if (stringToParse.equals("") | stringToParse.startsWith(" ") | stringToParse.matches(".*[0-9].*") | stringToParse.matches(".*[~`!@#$%^&*()-+={};:',.<>?/'_].*"))

                    throw new MyStringException(stringToParse);

                else  analizeString(stringToParse);    
            }

            catch (MyStringException exception) {

                stringToParse = null;
                flag = false;
                exception.AnalizeException();  
            } 
          }
            while (!flag);
}

Я удаляю пробелы между словами и из этихслова составляют всего одно

   static void analizeString (String someString) {

// + sign treat many spaces as one
      String delimitator = " +";

// words is a String Array
      words = someString.split(delimitator);

// temp is a string , will contain a single word
      temp = someString.replaceAll("[^a-z^A-Z]","");


         System.out.println("=============== Words are : ===============");
      for (int i=0;i<words.length;i++)
          System.out.println((i+1)+")"+words[i]);
    }  

Поэтому я пытаюсь сравнить каждое слово в части (каждое слово разбито на буквы) со всеми буквами из всех слов, но я не знаю, как посчитать количество той же буквы ипосле замены букв на правильные номера каждой буквы ???Есть идеи?

// this will containt characters for every word in part 
         char[] motot  =   words[id].toCharArray();

// this will containt all characters from all words     
         char[] notot = temp.toCharArray();


   for (int i =0;i<words[i].length();i++)

               for (int j=0;j<temp.length ;j++)

               {
                   if (i == j) {

                       System.out.println("Same word");

                   }

                   else   if (motot[i] == notot[j] ) {

                       System.out.println("Found equal :"+lol[i]+" "+lol1[j]);

                   }}

Ответы [ 4 ]

3 голосов
/ 17 декабря 2011

Для подсчета вы можете использовать Map<Character, Integer> counter как java.util.HashMap. Если для получения значения (целого числа) с использованием определенного ключа (символа) из счетчика значение «не равно нулю», тогда ваше значение ++ (использование автоматической блокировки). В противном случае добавьте новую запись (char, 1) в счетчик.

Замена букв цифрами должна быть довольно простой.

0 голосов
/ 17 декабря 2011

Вот решение, которое работает только для строчных букв. Ужасный, ужасный код, но я пытался понять, как мало строк может написать решение.

public static String letterCount(String in) {
  StringBuilder out = new StringBuilder(in.length() * 2);
  int[] count = new int[26];
  for (int t = 1; t >= 0; t--)
    for (int i = 0; i < in.length(); i++) {
      if (in.charAt(i) != ' ') count[in.charAt(i) - 'a'] += t;
      out.append((in.charAt(i) != ' ') ? "" + count[in.charAt(i) - 'a'] : " ");
    }
  return out.substring(in.length());
}
0 голосов
/ 17 декабря 2011

Вот некоторый код на C # (который достаточно похож на Java):

void replace(string s){

    Dictionary<char, int> counts = new Dictionary<char, int>();

    foreach(char c in s){
        // skip spaces
        if(c == ' ') continue;

        // update count for char c
        if(!counts.ContainsKey(c)) counts.Add(c, 1);
        else counts[c]++;
    }

    // replace characters in s
    for(int i = 0; i < s.Length; i++) 
        if(s[i] != ' ') 
            s[i] = counts[s[i]];
}

Обратите внимание на неизменные строки во втором цикле. Возможно, вы захотите использовать StringBuilder какого-то рода.

0 голосов
/ 17 декабря 2011

Лучше использовать сопоставление с шаблоном так:

изначально ..

private Matcher matcher; 
Pattern regexPattern = Pattern.compile( pattern ); 
matcher = regexPattern.matcher("");  

для совпадения нескольких шаблонов.

private final String[] patterns = new String [] {/* instantiate patterns here..*/} 
private Matcher matchers[]; 
for ( int i = 0; i < patterns.length; i++) {
Pattern regexPattern = Pattern.compile( pattern[i] ); 
matchers[i] = regexPattern.matcher(""); 

}

и затем для сопоставления с шаблоном .. вы делаете это ..

if(matcher.reset(charBuffer).find() ) {//matching pattern.} 

для проверки нескольких совпадений.

for ( int i = 0; i < matchers.length; i++ ) if(matchers[i].reset(charBuffer).find() ) {//matching pattern.} 

Не использовать сопоставление строк, не эффективно.

Всегда используйте CharBuffer вместо String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...