Java compareTo()没有按我希望的方式工作
我正在编写一个程序,我遇到了一个问题,我必须用我的“flight900”文件更改第一个数组中某些字符串的结束数。第一个数组已经按航班号排序,每个人有-1个行李。我正在使用二进制搜索算法搜索数组中的flight900名称,以便将它们与字符串值匹配。 我相信我的if-else链出了问题。if条件永远不满足。我找不到办法修理它。这是我的二进制搜索算法Java compareTo()没有按我希望的方式工作,java,arrays,string,compareto,Java,Arrays,String,Compareto,我正在编写一个程序,我遇到了一个问题,我必须用我的“flight900”文件更改第一个数组中某些字符串的结束数。第一个数组已经按航班号排序,每个人有-1个行李。我正在使用二进制搜索算法搜索数组中的flight900名称,以便将它们与字符串值匹配。 我相信我的if-else链出了问题。if条件永远不满足。我找不到办法修理它。这是我的二进制搜索算法 public class binarySort { public static void binary(String[] array, Str
public class binarySort
{
public static void binary(String[] array, String value, String array2[])
{
//Initializing
int middle, first=0, last=67, position=-1, counter=-1;
int result=0,a=0,b=0,c=0,d=0;
boolean found = false;
//binary search
while((!found) && (first<=last))
{
middle = ((first + last)/2);
//These are STRINGS to get the first name from the flight900 list
String str0 = array[middle].substring(6,9);
String str1 = array[middle].substring(6,10);
String str2 = array[middle].substring(6,11);
String str3 = array[middle].substring(6,12);
String str4 = array[middle].substring(6,13);
int answer0=0, answer1=0, answer2=0, answer3=0, answer4=0;
//THESE ARE INTEGERS
//compareTo(); returns 0 if both values are equal, a positive number of the first is bigger,
//and a negative number of the first is smaller
answer0 = str0.compareTo(value);
answer1 = str1.compareTo(value);
answer2 = str2.compareTo(value);
answer3 = str3.compareTo(value);
answer4 = str4.compareTo(value);
counter++;
/*I believe something is wrong in this if-else chain.*/
if((answer0==0)||(answer1==0)||(answer2==0)||(answer3==0)||(answer4==0))
{
found = true;
position = middle;
array[position] = array2[counter];
result = str0.compareTo(value);
}
else if((result >= 0)||(a >= 0)||(b >= 0)||(c >= 0)||(d >= 0))
{
last = (middle -1);
}
else
{
first = (middle + 1);
}
}
}
}
以防万一,这是我的flight900文本文件,我想把结束号改成
Barnett, Arnold U7678765 0
Berndt, Ernst G5643211 1
Carroll, John G5656789 1
Chen, Elaine Y7876780 1
Vijay, Garg R6567123 -1
Chu, Zen R2000098 2
Zheng, Wang U1321254 0
Costello, Anna P7878665 1
Cusumano, Michael E4543409 1
Dougherty, Jim W1232121 -1
Dyer, Barbara T8888765 2
Eppinger, Steven T2343111 -1
Fernandez, Roberto L7077765 0
Franck, Travis C6755437 2
运行它之后,我得到一个排序列表的输出,没有任何数字被更改
AZ386 Bill, Gate I8978999 Taurus -1
AZ386 Granja, Joao A4567897 Canis -1
AZ386 Hadzima, Joseph D3333123 Virgo -1
AZ386 Homer, Jack U8897529 Virgo -1
AZ386 Hynes, Tod T2323111 Taurus -1
AZ386 Isaacs, William O8796234 Cepheus -1
AZ386 Jackie, Stewart T7773123 Corvus -1
AZ386 Jay, Jason F5459908 Draco -1
AZ386 Kellogg, Suzuki Q1113133 Corona Founder of Sonny-1
AZ386 Michael, Schumacher U5454231 Aquarius -1
AZ495 Bent, Bernanke K8888909 Taurus Inventor of Hot Money Theory-1
AZ495 Gregory, Nathaniel P8796543 Eridanus -1
AZ495 Klein, Janice Q3773331 Cepheus -1
AZ495 Kogan, Leonid Q7777077 Capricornus -1
AZ495 Kritzman, Mark P9090888 Eridanus -1
AZ495 Little, John S7878653 Crux -1
AZ495 Malone, Thomas A1213878 Scorpius-1
AZ495 Mende, Paul D1219097 Cancer -1
AZ495 Nachtrieb, Robert F7878333 Leo -1
AZ495 O'Shea, Rory Y1212332 Canis -1
AZ495 Reagans, Ray X6321235 Canis -1
AZ495 Roberts, Edward X3434222 Virgo -1
AZ531 A, Mohd X9878038 Scorpius -1
AZ531 Ahmed, Faheem X6836493 Crux -1
AZ531 Alan, Bovik O5646324 Draco -1
AZ531 Alexis, Kwasinski L9875676 Corona CEO of Koyota Motor-1
AZ531 Babinchuk, Wayne N9847293 Cancer -1
AZ531 Barwreck, Obama E6666666 Eridanus Head of international spy ring-1
AZ531 Cummer, Rick H3947399 Leo -1
AZ531 Dhanjal, Surinder C9219437 Canis -1
AZ531 EL Miligi, Haytham C3947390 Canis Green peace activist-1
AZ531 Kwiatkowska, Mila U3845738 Virgo -1
AZ531 Lee, Mahnhoon Q9487400 Taurus -1
AZ531 Mikhail, Belkin W9876661 Cepheus -1
AZ531 Misseille, Obama E6666667 Eridanus Advisor of Barwreck Obama-1
AZ531 O'Neil, Kevin L8495849 Virgo -1
AZ531 Park, Andrew S4957459 Aquarius -1
AZ531 Rahman, Musfiq S8765567 Corvus -1
AZ531 Sharma, Mridula S7654566 Taurus Queen of Ingland-1
AZ874 Ackerman, Joshua P9809777 Virgo -1
AZ874 Akinc, Bridget F5456776 Virgo -1
AZ874 Andrea, Alu T7777656 Taurus -1
AZ874 Andreas, Gerstlauer P9868568 Cepheus -1
AZ874 Asquith, Paul F5676655 Aquarius -1
AZ874 Bei, Yu U8978999 Scorpius -1
AZ874 Deji, Akinwande S7678769 Canis -1
AZ874 Francesco, Monticone D6544678 Eridanus -1
AZ874 Jeff, Andrews Q2123443 Cancer United Nation negotiator-1
AZ874 Sarfraz, Khurshid I8767890 Leo -1
AZ874 Sarfraz, Khurshid S5654678 Canis -1
AZ874 Vijay, Garg K7686546 Capricornus -1
AZ874 Zheng, Wang J8767765 Eridanus -1
AZ874 Zhuoran, Zhao E6577779 Crux -1
AZ900 Barnett, Arnold U7678765 Corvus -1
AZ900 Berndt, Ernst G5643211 Taurus -1
AZ900 Carroll, John G5656789 Cepheus -1
AZ900 Chen, Elaine Y7876780 Draco Nobel prize (Beauty)-1
AZ900 Chu, Zen R2000098 Cepheus -1
AZ900 Costello, Anna P7878665 Eridanus -1
AZ900 Cusumano, Michael E4543409 Eridanus -1
AZ900 Dougherty, Jim W1232121 Scorpius -1
AZ900 Dyer, Barbara T8888765 Crux -1
AZ900 Eppinger, Steven T2343111 Cancer -1
AZ900 Fernandez, Roberto L7077765 Leo -1
AZ900 Franck, Travis C6755437 Canis IBN chief researcher-1
AZ900 Vijay, Garg R6567123 Corona -1
AZ900 Zheng, Wang U1321254 Capricornus -1
先谢谢你。我一整天都在试图解决它。这里有多个问题 您已从行的开头(偏移量0)对行进行排序。您正在尝试从偏移量0排序数据内的偏移量6进行二进制搜索。那是行不通的!如果在偏移量6的行内进行二进制搜索,则应该对同一偏移量的行进行排序,因为如果从偏移量6排序,行的顺序将不同 请看下面的代码块:
//These are STRINGS to get the first name from the flight900 list
String str0 = array[middle].substring(6,9);
String str1 = array[middle].substring(6,10);
String str2 = array[middle].substring(6,11);
String str3 = array[middle].substring(6,12);
String str4 = array[middle].substring(6,13);
看起来解析列表中的名字是一种可怕的方式。仅仅因为名称的长度可以不同,您无法尝试创建所有可能的子字符串并对其进行比较!您必须使用正确的分隔符分析行,以便可以清楚地分离出名称进行比较。那么您就不会有那么多字符串可供比较了
建议:
解析该行并从中创建一个对象。您可以将数据放在自定义类中,甚至可以放在带有键值对的映射中。基本上,您应该以解析格式保存行数据,以便轻松使用内容
然后,如果要按航班名称搜索,请创建一个地图,将已解析的航班名称作为键,将已解析的对象作为值。现在,要查找任何航班,您可以从地图中的名称中获取值。如果将有多个航班具有相同的名称(可能不是这样,但我不知道您的数据),那么您应该针对每个航班名称保存一个列表,以保存从每个航班解析的多个航班数据对象。当您查找航班名称时,您将获得与该名称匹配的所有航班的列表
希望有帮助 首先展示一个小的可重复的例子。我们不想查看代码块或日志块。Debug。显示两个产生“错误”比较结果的值。@HotLicks建议:如果没有调试器,请在出现故障的
compareTo()
之前将一个或两个打印输出放到代码中,显示正在比较的两个值。问题几乎肯定不是比较,而是围绕它的逻辑。这段代码有一些基本的设计问题。为什么要玩字符串,为什么不创建一个具有所需属性的保留对象,然后尝试比较特定的属性值,而不是获取一个子字符串进行比较,该子字符串可能会中断,因为您不知道名称的确切起始位置谢谢您Hot Clicks和Keshlam。我会试试看。Sanjeev,我试着用对象来做,但我遇到了麻烦,所以我换了弦乐,这对我来说更好一点。
AZ386 Bill, Gate I8978999 Taurus -1
AZ386 Granja, Joao A4567897 Canis -1
AZ386 Hadzima, Joseph D3333123 Virgo -1
AZ386 Homer, Jack U8897529 Virgo -1
AZ386 Hynes, Tod T2323111 Taurus -1
AZ386 Isaacs, William O8796234 Cepheus -1
AZ386 Jackie, Stewart T7773123 Corvus -1
AZ386 Jay, Jason F5459908 Draco -1
AZ386 Kellogg, Suzuki Q1113133 Corona Founder of Sonny-1
AZ386 Michael, Schumacher U5454231 Aquarius -1
AZ495 Bent, Bernanke K8888909 Taurus Inventor of Hot Money Theory-1
AZ495 Gregory, Nathaniel P8796543 Eridanus -1
AZ495 Klein, Janice Q3773331 Cepheus -1
AZ495 Kogan, Leonid Q7777077 Capricornus -1
AZ495 Kritzman, Mark P9090888 Eridanus -1
AZ495 Little, John S7878653 Crux -1
AZ495 Malone, Thomas A1213878 Scorpius-1
AZ495 Mende, Paul D1219097 Cancer -1
AZ495 Nachtrieb, Robert F7878333 Leo -1
AZ495 O'Shea, Rory Y1212332 Canis -1
AZ495 Reagans, Ray X6321235 Canis -1
AZ495 Roberts, Edward X3434222 Virgo -1
AZ531 A, Mohd X9878038 Scorpius -1
AZ531 Ahmed, Faheem X6836493 Crux -1
AZ531 Alan, Bovik O5646324 Draco -1
AZ531 Alexis, Kwasinski L9875676 Corona CEO of Koyota Motor-1
AZ531 Babinchuk, Wayne N9847293 Cancer -1
AZ531 Barwreck, Obama E6666666 Eridanus Head of international spy ring-1
AZ531 Cummer, Rick H3947399 Leo -1
AZ531 Dhanjal, Surinder C9219437 Canis -1
AZ531 EL Miligi, Haytham C3947390 Canis Green peace activist-1
AZ531 Kwiatkowska, Mila U3845738 Virgo -1
AZ531 Lee, Mahnhoon Q9487400 Taurus -1
AZ531 Mikhail, Belkin W9876661 Cepheus -1
AZ531 Misseille, Obama E6666667 Eridanus Advisor of Barwreck Obama-1
AZ531 O'Neil, Kevin L8495849 Virgo -1
AZ531 Park, Andrew S4957459 Aquarius -1
AZ531 Rahman, Musfiq S8765567 Corvus -1
AZ531 Sharma, Mridula S7654566 Taurus Queen of Ingland-1
AZ874 Ackerman, Joshua P9809777 Virgo -1
AZ874 Akinc, Bridget F5456776 Virgo -1
AZ874 Andrea, Alu T7777656 Taurus -1
AZ874 Andreas, Gerstlauer P9868568 Cepheus -1
AZ874 Asquith, Paul F5676655 Aquarius -1
AZ874 Bei, Yu U8978999 Scorpius -1
AZ874 Deji, Akinwande S7678769 Canis -1
AZ874 Francesco, Monticone D6544678 Eridanus -1
AZ874 Jeff, Andrews Q2123443 Cancer United Nation negotiator-1
AZ874 Sarfraz, Khurshid I8767890 Leo -1
AZ874 Sarfraz, Khurshid S5654678 Canis -1
AZ874 Vijay, Garg K7686546 Capricornus -1
AZ874 Zheng, Wang J8767765 Eridanus -1
AZ874 Zhuoran, Zhao E6577779 Crux -1
AZ900 Barnett, Arnold U7678765 Corvus -1
AZ900 Berndt, Ernst G5643211 Taurus -1
AZ900 Carroll, John G5656789 Cepheus -1
AZ900 Chen, Elaine Y7876780 Draco Nobel prize (Beauty)-1
AZ900 Chu, Zen R2000098 Cepheus -1
AZ900 Costello, Anna P7878665 Eridanus -1
AZ900 Cusumano, Michael E4543409 Eridanus -1
AZ900 Dougherty, Jim W1232121 Scorpius -1
AZ900 Dyer, Barbara T8888765 Crux -1
AZ900 Eppinger, Steven T2343111 Cancer -1
AZ900 Fernandez, Roberto L7077765 Leo -1
AZ900 Franck, Travis C6755437 Canis IBN chief researcher-1
AZ900 Vijay, Garg R6567123 Corona -1
AZ900 Zheng, Wang U1321254 Capricornus -1
//These are STRINGS to get the first name from the flight900 list
String str0 = array[middle].substring(6,9);
String str1 = array[middle].substring(6,10);
String str2 = array[middle].substring(6,11);
String str3 = array[middle].substring(6,12);
String str4 = array[middle].substring(6,13);