0

我有一个任务要编写一个接受两个字符串作为参数的方法,如果第一个字符串在字典上在第二个字符串之前、等于或之后,则返回一个值1, 0, (分别),仅使用字符串中的and方法班级。-1charAt()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;
        }*/
    }
}

那么我到底做错了什么?谢谢你的帮助。

4

4 回答 4

3

_st.charAt(i) += 32;

这是没有意义的。

_st.charAt(i)返回一个char。如果您不将结果存储在某个变量中,则向该字符添加 32 没有任何意义。

您可以将其替换为:

 char c = _st.charAt(i);
 c += 32;
于 2014-12-28T15:26:20.087 回答
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',检查是否为负数,so string2.charAt(i)is greater than string1.charAt(i),表示它在后面。

于 2014-12-28T15:59:03.270 回答
0

你可以看看java.lang.String.compareTo()java.lang.String.compareToIgnoreCase()?如果你可以使用标准的Java库函数,你可以直接使用,如果不行,你可以参考相同的实现。

我知道这是一条捷径,但它会让你更好地理解。

于 2014-12-29T12:03:23.043 回答
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;
}
于 2014-12-28T15:51:32.847 回答