字符串中的String.charAt(i)在Java中不起作用

时间:2014-12-28 15:24:08

标签: java loops variables if-statement charat

我有一个编写一个接受两个字符串作为参数的方法的赋值,如果第一个字符串是,则返回值10-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;
        }*/
    }
}

那我究竟做错了什么?谢谢你的帮助。

4 个答案:

答案 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库函数,你可以直接使用它们,如果没有,你可以参考它们的实现。

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