for循环中的String.charAt(i)在Java中不起作用
我有一个任务,要编写一个方法,该方法接受两个字符串作为参数,并返回一个值for循环中的String.charAt(i)在Java中不起作用,java,loops,variables,if-statement,charat,Java,Loops,Variables,If Statement,Charat,我有一个任务,要编写一个方法,该方法接受两个字符串作为参数,并返回一个值1,0,-1(分别),如果第一个字符串按字典顺序在第二个字符串之前、相等或之后,只使用charAt()和length()字符串类中的方法 问题是,即使我在for循环中初始化了一个int变量,它在以后使用charAt()方法时在循环中也无法识别它们。编译器一直在说“意外类型。必需:变量;找到:值”(使用BlueJ) 公共类单词{ 私人字符串(st); /** *小写字母范围:a=97,z=122。 * *范围大写字母:A=6
1
,0
,-1
(分别),如果第一个字符串按字典顺序在第二个字符串之前、相等或之后,只使用charAt()
和length()
字符串类中的方法
问题是,即使我在for循环中初始化了一个int变量,它在以后使用charAt()
方法时在循环中也无法识别它们。编译器一直在说“意外类型。必需:变量;找到:值”(使用BlueJ)
公共类单词{
私人字符串(st);
/**
*小写字母范围:a=97,z=122。
*
*范围大写字母:A=65,Z=90。
*/
公共整数myCompare(字符串s1、字符串s2){
字符[]字母表={'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'};
//第一环路i;
//第二回路j;
//第三回路k;
对于(int i=0;is2.字符(0)){
返回-1;
}
否则{
返回0;
}*/
}
}
那么我到底做错了什么?感谢您的帮助。\u st.charAt(i)+=32代码>
这是毫无意义的
\u st.charAt(i)
返回一个char
。如果不将结果存储在某个变量中,则向该字符添加32没有任何意义
您可以将其替换为:
char c = _st.charAt(i);
c += 32;
\u st.charAt(i)+=32代码>
这是毫无意义的
\u st.charAt(i)
返回一个char
。如果不将结果存储在某个变量中,则向该字符添加32没有任何意义
您可以将其替换为:
char c = _st.charAt(i);
c += 32;
享受这种工作方式
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;
}
publicstaticintcompareWords(字符串mot1,字符串mot2){
字符串toLowerCase=mot1.toLowerCase();
字符串toLowerCase1=mot2.toLowerCase();
int answer=0,lenght=(mot1.length()享受这种工作方法吧
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;
}
publicstaticintcompareWords(字符串mot1,字符串mot2){
字符串toLowerCase=mot1.toLowerCase();
字符串toLowerCase1=mot2.toLowerCase();
int answer=0,lenght=(mot1.length()此外,\u 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;
}
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)
,这意味着它在后面。此外,\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;
}
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)
,这意味着它在后面。您可以查看java.lang.String.compareTo()
和java.lang.String.comparetognorecase()
?如果可以使用标准Java库函数,可以直接使用这些函数,如果不可以,可以参考相同的实现
我知道这是一条捷径,但它会让你更好地理解。你可以看看java.lang.String.compareTo()
和java.lang.String.CompareTignoreCase()
?如果你可以使用标准java库函数,你可以直接使用它们,如果不可以,你可以参考它们的实现
我知道这是一条捷径,但它会让你更好地理解。虽然这不会改变字符串本身,但如果它是应该这样做的话!@Charlie你不能改变字符串的存在。它是不可变的。虽然这不会改变字符串本身,但如果它是应该这样做的话!@Charlie你不能改变字符串的存在。它是不可变的。我会做if(_st.charAt(I)<90)
,因为((char)95)不应该变成((char)127)!而且,你不能只使用\u st.toUpperCase()
?如果你写了char[]alphabet=“abcd…wxyz”。tocharray()
而不是char[]alphabet={'a','b','c','d',…,'w','x','y','z'}
-前提是您自己键入了它。@mcepender或char[]alphabet=new char[27];for(char c='a';c这是正确的。但是声明t