[编辑]:我已经重写了所有内容,我通过开始将大多数数组都用大写字母来找到一种更为简单的方法,这种比较更容易!谢谢你的帮助:)
我是java的初学者,我必须编写自己的compareTo()
方法来按字典顺序与字符串进行比较。例如,"hello"
和"hello"
应该相同,而"hello"
和"hello world"
应该给s2> s1。在大写字母的情况下,比较假设返回相同的,例如" HeLLo"和" HELLO"应该给出相同的,但是当我使用ASCII值时,我很难搞清楚这一点。最后,弦也可以具有不同的长度。
这是我到目前为止所做的事情:
public class compare
{
public static void main(String[] args)
{
String s1 = "HHzllozz";
String s2 = "LLLLLLellozzzzzzz";
//System.out.println(s1.length()); --> just here to check
//System.out.println(s2.length());
char char1;
char char1b;
char char2;
char char2b;
int index = 0;
int compNb = 0; //--> keep track of the nb of comparisons done
if (s1.length()<s2.length())
{
compNb = s1.length();
}
else
{
compNb = s2.length();
}
System.out.println(compNb);
for(int i=0; i<compNb; i++)
{
char1 = s1.charAt(i);
char1b = s1.toUpperCase().charAt(i);
char2 = s2.charAt(i);
char2b = s2.toUpperCase().charAt(i);
int ascii1 = (int) char1;
int ascii2 = (int) char2;
if (s1.length()>s2.length())
{
for( int j = 0; j<s2.length(); j++)
{
if(ascii1 > ascii2)
{
index = 1;
break;
}
else if(ascii1 < ascii2)
{
index = -1;
break;
}
else
{
index = 1;
}
}
}
if(s1.length()<s2.length())
{
for(int j = 0; j<s2.length(); j++)
{
if(ascii1 > ascii2)
{
index = 1;
break;
}
else if(ascii1 < ascii2)
{
index = -1;
break;
}
else
{
index = -1;
}
}
}
if(s1.length() == s2.length())
{
if(ascii1 > ascii2)
{
index = 1;
break;
}
else if(ascii1 < ascii2)
{
index = -1;
break;
}
else if(s1.charAt(i) == s2.charAt(i) || s1.charAt(i) == s2.toUpperCase().charAt(i) || s2.charAt(i) == s1.toUpperCase().charAt(i))
{
index ++;
}
}
//System.out.println(s1.charAt(i) + " value : "+ ascii1);
//System.out.println(s2.charAt(i) + " value : " + ascii2);
}
System.out.println(index);
if (index == compNb && compNb !=1)
{
System.out.println("same");
}
if(index == 1)
{
System.out.println("S1>s2");
}
if(index == -1)
{
System.out.println("s2>s1");
}
}
}
它适用于某些情况,但不适用于所有这些情况,老实说我很遗憾。例如,在上面给出的情况中,它显示s1> s2,但情况并非如此。
答案 0 :(得分:0)
首先,你在下面的陈述有点混乱。你能澄清一下:
如果是大写字母,比较假设不会改变,但是因为我使用的是ascii值,所以我很难搞清楚这一点。
你的逻辑似乎也很复杂。您应该尝试简化这样的事情。首先理解并定义您的解决方案,然后跳转到编码。我用简单的英语提出解决方案,但它很容易编码:
要比较2个字符串s1和s2,定义这些规则并实现它们:
当然,您必须在开头检查空值,以避免方法中出现任何不适当的异常。
[基于OP的问题更新]
如果您只想按字典顺序根据字符串的等级返回答案,则无需检查字符串的长度。只需执行以下操作:
为两个字符串创建2个字符串数组并按顺序迭代它们检查是否相等,这样的事情(我使用java API进行大写转换并将字符串转换为字符数组,如果你愿意,可以自己编写):
String s1 = string1.toUppercase();
String s2 = string2.toUppercase();
char[] s1Array = s1.toCharArray(); //confirm exact API or write your method
char[] s1Array = s1.toCharArray();
int lengthToConsider = (s1Array.length < s2Array.length) ? s1Array.length : s2Array.length;
for(int i=0; i<lengthToConsider; i++)'
{
if( s1Array[i] < s2Array[i] )
{
return "s2>s1";
}
else if( s1Array[i] > s2Array[i] )
{
return "s1>s2";
}
}
// if you reach here, that means all letters compared earlier are same
if(s1Array.length > s2.length)
{
return "s1>s2";
}
else if(s1Array.length < s2.length)
{
return "s2>s1";
}
else
{
return "equal";
}