我必须编写一个方法来按字母顺序比较字符串并返回一个int
。我无法使用任何内置函数,我应该使用 for
循环。
我不确定如何处理不同长度的字符串。目前我的主要问题是代码仅比较每个字符串的第一个字符然后返回 int,但我不能将 return Comparison;
放在 for 循环之外
public class poop {
public static int Compare(String s1, String s2) {
for (int i = 0; i < s1.length() && i < s2.length(); i++) {
int comparison = 0;
int ascii1 = 0;
int ascii2 = 0;
//convert chars into their ascii values
ascii1 = (int) s1.charAt(i);
ascii2 = (int) s2.charAt(i);
//treat capital letters as lower case
if (ascii1 <= 95) {
ascii1 += 32;
} if (ascii2 <= 95) {
ascii1 += 32;
}
if (ascii1 > ascii2) {
comparison = 1;
} else if (ascii1 < ascii2) {
comparison = -1;
} else {
comparison = 0;
}
}
return comparison;
}
public static void main(String[] args) {
String s1 = "aba";
String s2 = "aaa";
System.out.println(Compare(s1,s2));
}
}
最佳答案
如果按字母顺序比较,则意味着字符串中的第一个不同字符定义了差异。例如:aab
位于 aac
之前因为c
.
对于不同长度的字符串,较大的字符串在较小的字符串之后(字典使用该约定)。所以aaaa
之后 aaa
,因为aaaa
更大。
所以,让我们完成它:
/**
* Will return an integer bigger than 1 if s1 is "bigger" than s2
*/
public static int compareStrings(String s1, String s2) {
int comparison = 0;
int c1, c2;
for(int i = 0; i < s1.length() && i < s2.length(); i++) {
c1 = (int) s1.toLowerCase().charAt(i); // See note 1
c2 = (int) s2.toLowerCase().charAt(i); // See note 1
comparison = c1 - c2; // See note 2
if(comparison != 0) // See note 3
return comparison;
}
if(s1.length() > s2.length()) // See note 4
return 1;
else if (s1.length() < s2.length())
return -1;
else
return 0;
}
注释:
- 我使用
toLowerCase()
方法将字符串转换为小写。如果您无法使用任何“内置”方法,则可以使用您的转换(即ASCII += 32
部分)。但是,您必须小心:在像这样转换之前,您必须检查字符值是否为字母字符(使用 google 查找 ASCII 表并检查哪些是有效的字母字符值) -
c1
和c2
是整数,所以comparison = c1 - c2
将保存这些整数(字符)之间的差异。 - 如果
comparison == 0
,这意味着字符是相等的,所以什么也不做。但如果comparison != 0
,字符不同;如果comparison > 0
这意味着c1
比c2
“更大” ,所以s1
更大(看我答案的第一段);如果comparison < 0
然后s2
更大。所以,如果
comparison != 0
,那么你可以返回它的值。请记住:return
句子做了两件事:返回一个值并退出函数。所以执行for
循环也停止了。 - 前面的代码解决了最小字符串长度的问题。但是,正如您的问题中所发布的,您必须处理字符串长度不同的情况。代码的最后一部分处理它们(只有当
comparison
仍然是0
时才能到达):- 如果
s1.lenght() > s2.length()
,然后s1
比s2
“更大” ,因此返回正值 (+1
)。 - 如果
s1.lenght() < s2.length()
,然后s1
比s2
“小” ,因此返回负值 (-1
)。 - 在任何其他情况下,这都意味着两件事:
(a) 两个字符串的所有字符都相等(因为
comparison == 0
),并且(b) 两个字符串的长度相等
因此字符串相等,并且必须返回零值。
- 如果
关于java - 在Java中通过ascii值比较2个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26553889/