2014-02-28 2 views
0

У меня есть большая строка, например, «настенный зал для навеса на стене», и я хочу напечатать самые длинные строки. Затем я хочу знать, сколько раз повторяются все самые длинные строки?
Для exampele, длинные строки:
стены повторяются 2
зала повторяются 2
падения повторяется 1
Это мой код:Найти самые длинные строки

public void bigesttstring(String str){ 
    String[] wordsArray=str.split(" "); 
    int n= str.trim().split("\\s+").length; 
    int maxsize=0; 
    String maxWord=""; 
    for(int i=0;i<wordsArray.length;i++){ 
     if(wordsArray[i].length()>maxsize){ 
      maxWord=wordsArray[i]; 
      maxsize=wordsArray[i].length(); 
     } 
    } 
    System.out.println("Max sized word is "+maxWord+" with size "+maxsize); 
} 

Но этот код только печатает " стена».
для подсчета повторен строки (я имею в виду "maxWord"), этот код записи:

int count=0; 
for(int i=0;i<wordsArray.length;i++){ 
    if(maxWord.equals(wordsArray[i])){ 
     count++; 
    } 
} 

и для отображения других длинных строк у меня есть этот код:

int k=0; 
for(int i=0;i<wordsArray.length;i++){ 
    if(maxWord.equals(wordsArray[i])){ 
     continue; 
    } 
    if(maxsize==wordsArray[i].length()){ 
     k++; 
    } 
} 
String[] other=new String[k]; 
int o=0; 
for(int i=0;i<wordsArray.length;i++){ 
    if(maxWord.equals(wordsArray[i])){ 
     continue; 
    } 
    if(maxsize==wordsArray[i].length()){ 
     other[o]=wordsArray[i]; 
     o++; 
    } 
} 

I позволили использовать следующие функции:

char char At(int i);    
int ComoareTo(String another string);    
boolean endsWith(String suffix);      
int indexof();      
int indexof(String str);      
String substring(); 
char[] toCharArray();        
String lowercase();   

И еще один код для кратчайших строк.

+0

Вы спрашиваете нас, как помочь вам справиться с проблемой подсчета? Если это так, что вы пытались решить проблему подсчета самостоятельно? –

+0

для count у меня есть этот код: for (int i = 0; i user3359479

+0

ссылка - http://stackoverflow.com/questions/22034250/java-program-to-find-the-character-that-appears-the-most-number-of-times-in-a -st/22034332 # 22034332 – TheLostMind

ответ

0

Вы написали

if(wordsArray[i].length()>maxsize) 

Для wall, hall and fall, это верно только для first wall. Вот почему вы получаете wall and size 4. Здесь вы не считаете, что самая длинная длина строки может быть одинаковой для разных строк. Вы должны хранить самую длинную строку в array и if condition должны быть

if(wordsArray[i].length()>=maxsize) 

вы будете рассматривать = and > случай отдельно. Так как в случае > вам нужно будет delete all the string in array.

0

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

package OtherPeoplesCode; 

public class string { 

    public static void main(String[] args) { 
     bigeststring("wall hall to wall hall fall be"); 
    } 

    public static void bigeststring(String str){ 
     String[] wordsArray=str.split(" "); 
     String[] biggestWordsArray = new String[wordsArray.length]; 
     int x = 0; 
     int n= str.trim().split("\\s+").length; 
     int maxsize=0; 
     String maxWord=""; 
     for(int i=0;i<wordsArray.length;i++){ 
      if(wordsArray[i].length()>maxsize){ 
       maxWord=wordsArray[i]; 
       maxsize=wordsArray[i].length(); 
       for(int y = 0; y <= biggestWordsArray.length -1; y++){ 
        biggestWordsArray[y] = ""; 
       } 
      } 
      else if(maxsize==wordsArray[i].length()){ 
       biggestWordsArray[x] = wordsArray[i]; 
       x++; 
      } 
     } 
     if(biggestWordsArray[0].equals("")){ 
      System.out.println("Max sized word is "+maxWord+" with size "+maxsize); 
     } 
     else if(!(biggestWordsArray[0].equals(""))){ 
      System.out.println("TIE!"); 
      for(int y = 0; y <= biggestWordsArray.length -1; y++){ 
       if(!(biggestWordsArray[y].equals(""))){ 
        System.out.print("Word #" + y + " is "); 
        System.out.println(biggestWordsArray[y]); 
       } 
      } 
     } 
    } 
} 

EDIT: Это рабочий код, извините за задержку.

+0

@ user3359479 Я отправил ответ, скажи мне, что ты думаешь. Я верю, что достиг желаемого. –

+0

ok, plz w8 ..... – user3359479

+0

@ Cammy_the_block, я получаю следующие ошибки: http://i61.tinypic.com/eporvt.jpg – user3359479

0

Использование Map возможно является самым простым и простым способом. Однако, если вы сказали, что ваш учитель не позволяет вам использовать его, можете ли вы рассказать нам, что разрешено? Чтобы мы не теряли время, предлагая разные методы, и в конечном итоге ни одно из них не является приемлемым, потому что ваш учитель не разрешает.

Один наиболее грубая сила так, что я могу предложить вам попробовать это (много места для оптимизации, но я думаю, что вы можете самый простой способ):

  1. цикл по списку слов, и найти выведите длину самого длинного слова и количество слов с такой длиной
  2. Создайте новый массив с «числом слов», которое вы нашли в 1. Повторите цикл через исходный список слов для каждого слова длиной == maxWordLength, положите что в новом массиве IF он еще не существует в нем (простая проверка по циклу.
  3. Теперь у вас есть список, содержащий все DISTINCT слова, которые являются «самыми длинными», с некоторым возможным нулем в конце. Чтобы отобразить их в формате «word: numOfOccurence», вы можете сделать что-то вроде
  4. проведите через массив результатов до тех пор, пока вы не нажмете нуль. Для каждого слова в массиве результатов необходимо иметь цикл в исходном списке слов для подсчета его появления. Затем вы можете распечатать сообщение, как вы хотите

в коде: псевдо

String[] wordList = ....; 
int maxLen = 0; 
int maxLenOccurence = 0; 
foreach word in wordList { 
    if word is longer then maxLen { 
     maxLen = word's length 
     maxLenOccurence = 1; 
    } 
    else if word's length is equals to maxLen { 
     maxLenOccurence ++ 
    } 
} 

// 2,3 
String[] maxLenWordList = new String[maxLenOccurence]; 
foreach word in wordList { 
    else if word's length is equals to maxLen { 
     for i = 0 to maxLenWordList length { 
      if (maxLenWordList[i] == word) 
       break 
      if (maxLenWordList[i] == null 
       maxLenWordList[i] = word 
    } 
} 

//4 
foreach maxLenWord in maxLenWordList { 
    count = 0 
    foreach word in wordList { 
     if maxLenWord == word 
      count ++ 
    } 
    display "Max sized word is "+ maxLenWord + " with size " + count 
} 

Другой способ не включает в себя другие структуры данных:

  1. Есть список слов
  2. Сортировка списка слов сначала по длине, затем по буквальному значению
  3. Первый элемент списка результатов является самым длинным, а строка с тем же значением становится смежным. Вы можете сделать цикл печати всех совпадений и их подсчета (подумайте сами здесь. Не должно быть так сложно)
+0

Я написал функции разрешенные, но думаю, что с ними невозможно! – user3359479

+0

@ user3359479 Я не могу понять, что вы подразумеваете под своим предыдущим комментарием. –

+0

Просмотреть главный пост. – user3359479

Смежные вопросы