我在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++;
}
}
}
我希望在常见的数组中放置我在文本或这些单词中的元素
然后在这些单词之间找到具有最大长度的字符串但它不能更正确地工作它向我显示这些单词以及许多空元素。
如何更正?
答案 0 :(得分:3)
以下代码段应具有指导意义:
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
数组
StringTokenizer
是遗产类;更喜欢String.split
Comparator
和Collections.sort
对List
Comparator
的好例子)int
,逐个减法的比较被打破 - 请小心使用!请注意,上述解决方案为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 :(得分:1)
为什么不将每个句子的单词放入Set
,然后使用retainAll()
计算两个集合的交集,而不是手动搜索常用单词?
Set Interface上的本教程可能会有所帮助。
我认为这是家庭作业......你是否了解过算法的复杂性,又称Big-O符号?如果是这样,请考虑发布的代码与使用TreeSet
与使用HashSet
的复杂性相比较。