我有一个编写一个接受两个字符串作为参数的方法的赋值,如果第一个字符串是,则返回值1
,0
,-1
(分别)词典之前,等于或在第二个字符串之后,仅使用String类中的charAt()
和length()
方法。
问题在于,即使我在for循环中初始化了一个int变量,但在使用charAt()
方法时,它也不会在循环中识别它们。编译器一直说“意外类型。必需:变量;找到:值”(使用BlueJ)。
public class Word {
private String _st;
/**
* range small letters: a = 97, z = 122.
*
* range capital letters: A = 65, Z = 90.
*/
public int myCompare(String s1, String s2) {
char[] alphabet = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
//1st loop i;
//2nd loop j;
//3rd loop k;
for (int i = 0; i < s1.length(); i++) {
_st = new String (s1);
if (_st.charAt(i) < 97) {
_st.charAt(i) += 32;
}
for (int j = 0; alphabet[j] == _st.charAt(i); j++) {
int x = alphabet[j];
_st.charAt(i) = x;
}
}
return 1; // temporaray.
/*
if (s1.charAt(0) < s2.charAt(0)) {
return 1;
}
else if (s1.charAt(0) > s2.charAt(0)) {
return -1;
}
else {
return 0;
}*/
}
}
那我究竟做错了什么?谢谢你的帮助。
答案 0 :(得分:3)
_st.charAt(i) += 32;
这没有意义。
_st.charAt(i)
返回char
。如果不将结果存储在某个变量中,则向该char添加32没有任何意义。
您可以将其替换为:
char c = _st.charAt(i);
c += 32;
答案 1 :(得分:1)
此外,_st.charAt(i) += 32;
对结果没有任何作用,你的算法有点复杂。您应该使用两个字符串进行比较,而不是通过字母表进行比较:
public static int myCompare(String string1, String string2) {
int result = 0;
int differenceCases='a'-'A';
int end = (string1.length() > string2.length())
? string2.length()
: string1.length();
for (int index = 0; index < end; index += 1) {
int char1=(string1.charAt(index)>'Z')?(string1.charAt(index)-differenceCases):(string1.charAt(index));
int char2=(string2.charAt(index)>'Z')?(string2.charAt(index)-differenceCases):(string2.charAt(index));
int difference = char1-char2;
if (difference == 0 || abs(difference) == differenceCases) continue;
return (difference < 0) ? 1 : -1;
}
return result;
}
1)你应该注意两个字符串中哪一个是较长的字符串,以防止出现问题。
int end = (string1.length() > string2.length())
? string2.length()
: string1.length();
2)您可以使用两个字符串的ASCII值。
2aa)计算不同的位置
2ab)确保您有相同的比较案例
int char1=(string1.charAt(index)>'Z')?(string1.charAt(index)-differenceCases):(string1.charAt(index));
如果小写减去案例之间的差异('a' - 'A')。
2ba)如果差异为 0 ,则您有两个相同类型的字符。
2bb)如果绝对差值为'a' - 'A',则您的字母相同,但是混合情况
2bc)在每种情况下,没有区别,所以跳到下一个字母
2c)如果你有一个差异,大于'a' - 'A',检查它是否为负数,因此string2.charAt(i)
大于string1.charAt(i)
,这意味着它会被追踪。
答案 2 :(得分:0)
享受这种有效的方法
public static int compareWords(String mot1,String mot2){
String toLowerCase = mot1.toLowerCase();
String toLowerCase1 = mot2.toLowerCase();
int answer=0,lenght=(mot1.length()<mot2.length())?mot1.length():mot2.length();
for (int i = 0; i < lenght; i++) {
if (toLowerCase.charAt(i)<toLowerCase1.charAt(i)) {
answer=1;
// System.out.println("loop1:"+answer);
}else{
if (toLowerCase.charAt(i)>toLowerCase1.charAt(i)) {
answer=-1;
break;
}
}
}
if (answer==0) {
if (mot1.length()<mot2.length()) {
answer=1;
// System.out.println("if1:"+answer);
}else {
if (mot1.length()==mot2.length()) {
answer=0;
}else answer=-1;
}
}
// System.out.println("answer:"+answer);
return answer;
}
答案 3 :(得分:0)
您可以查看java.lang.String.compareTo()
和java.lang.String.compareToIgnoreCase()
?如果你可以使用标准的Java库函数,你可以直接使用它们,如果没有,你可以参考它们的实现。
我知道这是一条捷径,但它可以让你更好地理解。