самая длинная строка в текстах - PullRequest
0 голосов
/ 03 мая 2010

У меня следующий код на Java:

import java.util.*;
public class longest{
public static void main(String[] args){
int t=0;int m=0;int token1, token2;
   String words[]=new String[10];
    String word[]=new String[10];
String common[]=new String[10];
   String text="saqartvelo gabrwyindeba da gadzlierdeba aucileblad ";
     String text1="saqartvelo gamtliandeba da gadzlierdeba aucileblad";
StringTokenizer st=new StringTokenizer(text);
StringTokenizer st1=new StringTokenizer(text1);

token1=st.countTokens();
token2=st1.countTokens();
while (st.hasMoreTokens()){

words[t]=st.nextToken();
  t++;
}
  while (st1.hasMoreTokens()){
     word[m]=st1.nextToken();
  m++;
}
 for (int k=0;k<token1;k++){
     for (int f=0;f<token2;f++){
      if (words[f].compareTo(word[f])==0){
  common[f]=words[f];
}
}
}
   while (i<common.length){
   System.out.println(common[i]);
   i++;
}
}
}

Я хочу, чтобы в общий массив помещались элементы, которые я и в тексте, или в эти слова

  • saqartvelo (грузия по-английски)
  • да (и на английском)
  • gadzlierdeba (будет сильнее)
  • aucileblad (обязательно)

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

Как мне исправить это?

Ответы [ 2 ]

3 голосов
/ 03 мая 2010

Следующий фрагмент должен быть поучительным:

    import java.util.*;
    //...

    String text1 = "saqartvelo gabrwyindeba da gadzlierdeba aucileblad";
    String text2 = "saqartvelo gamtliandeba da gadzlierdeba aucileblad";

    List<String> common = new ArrayList<String>();
    for (String s1 : text1.split(" ")) {
        for (String s2 : text2.split(" ")) {
            if (s1.equals(s2)) {
                common.add(s1);
            }
        }
    }

    Collections.sort(common, new Comparator<String>() {
        @Override public int compare(String s1, String s2) {
            return s2.length() - s1.length();
        }       
    });

    System.out.println(common);
    // prints "[gadzlierdeba, saqartvelo, aucileblad, da]"

Ключевые идеи:

  • Предпочитают List над массивами
    • Особенно удобно, если вы не знаете, сколько элементов будет заранее
  • Предпочитают foreach
  • StringTokenizer - унаследованный класс; предпочитаю String.split
  • Используйте пользовательские Comparator и Collections.sort для сортировки List

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


Альтернативное решение

Обратите внимание, что вышеприведенное решение - O(N^2), поскольку оно проверяет каждую пару слов, чтобы увидеть, равны ли они Это означает, что он плохо масштабируется, когда в двух текстах много слов. Используя Set, например HashSet, вы можете сделать это в ожидаемое время O(N), используя Set.retainAll для вычисления пересечения двух множеств.

static Set<String> wordSet(String text) {
    return new HashSet<String>(Arrays.asList(text.split(" ")));
}
//...

String text1 = ...;
String text2 = ...;

Set<String> commonSet = wordSet(text1);
commonSet.retainAll(wordSet(text2));

List<String> common = new ArrayList<String>(commonSet);
System.out.println(common);
// prints "[da, aucileblad, saqartvelo, gadzlierdeba]"
// in no particular order

// sort by string length using Comparator as above
1 голос
/ 03 мая 2010

Вместо ручного поиска общих слов, почему бы не поместить слова каждого предложения в Set, а затем вычислить пересечение обоих наборов, используя retainAll()?

Это руководство по интерфейсу установки может помочь.

Полагаю, это домашнее задание ... вы узнали об алгоритмической сложности, иначе говоря, Big-O? Если это так, рассмотрите сложность вашего размещенного кода против использования TreeSet против использования HashSet.

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