Java compareTo()没有按我希望的方式工作

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

我正在编写一个程序,我遇到了一个问题,我必须用我的“flight900”文件更改第一个数组中某些字符串的结束数。第一个数组已经按航班号排序,每个人有-1个行李。我正在使用二进制搜索算法搜索数组中的flight900名称,以便将它们与字符串值匹配。 我相信我的if-else链出了问题。if条件永远不满足。我找不到办法修理它。这是我的二进制搜索算法

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);