如何使用二进制搜索java打印数组中的重复值

如何使用二进制搜索java打印数组中的重复值,java,arrays,matrix,netbeans,Java,Arrays,Matrix,Netbeans,您好,我正在创建一个程序,它有两个并行数组(studentNum和grades),在searchMark方法中,我会提示用户也输入他们想要查找的年级。然后,程序使用二进制搜索来查找该值,然后检查是否有其他学生拥有该值。然后所有的学生号和他们的成绩一起被打印在输出屏幕上。在数组中找到目标的第一个实例后,程序/代码将立即结束,我已经包括了一张我的输出是什么以及输出应该是什么样子的图片 // Binary Search int startIndex = 0, endIndex =

您好,我正在创建一个程序,它有两个并行数组(studentNum和grades),在searchMark方法中,我会提示用户也输入他们想要查找的年级。然后,程序使用二进制搜索来查找该值,然后检查是否有其他学生拥有该值。然后所有的学生号和他们的成绩一起被打印在输出屏幕上。在数组中找到目标的第一个实例后,程序/代码将立即结束,我已经包括了一张我的输出是什么以及输出应该是什么样子的图片

       // Binary Search
    int startIndex = 0, endIndex = 0;
    int middleIndex;
    int shiftPlus = 0;
    int shiftMinus = grade.length-1;
    int midValue = 0;

    while (startIndex <= endIndex) {
        
        middleIndex = (startIndex+endIndex)/2;
        
        if (grade[middleIndex] == target) {
            midValue = grade[middleIndex];
            System.out.println("student #" + student[middleIndex] 
            + " has a correct count of " + target);
            break;
        }
        else if (grade[middleIndex] > target)
            endIndex = middleIndex-1;
        
        else if (grade[middleIndex] < target)
            startIndex = middleIndex + 1;

    }  
    
    boolean aboveMid = true, belowMid = true; // for while loops to stop/start
    
    while (shiftPlus <= midValue && aboveMid == true) {
        shiftPlus += 1; // starts at 0 and moves 1 up each loop            
        if(grade[shiftPlus] == target && shiftPlus <= midValue) 
        {
            System.out.println("student #" + student[shiftPlus] 
            + " has a correct count of " + target);
        }
        else
            belowMid = false;          
    }
    
    while (shiftMinus >= midValue && belowMid == true) {
        shiftMinus -= 1; // subtract one from end
        if(grade[shiftMinus] == target && shiftMinus <= midValue) 
        {
            System.out.println("student #" + student[shiftMinus] 
            + " has a correct count of " + target);
        } 
        else
            aboveMid = false;            
    }
}
//二进制搜索
int startIndex=0,endIndex=0;
int中间索引;
int-shiftPlus=0;
int shiftMinus=等级。长度-1;
int中值=0;
while(startIndex目标)
endIndex=middleIndex-1;
否则如果(等级[中间索引]<目标)
startIndex=middleIndex+1;
}  
布尔值UpperMID=true,belowMid=true;//用于while循环停止/启动

虽然(shiftPlus二进制搜索内置于java(
Arrays.binarySearch
)中,但自己编写是错误的。当然,除非这是家庭作业,编写二进制搜索算法是家庭作业

请注意,二进制搜索要求对输入数组进行排序。对未排序的输入运行binsearch会产生垃圾。如中所示,没有错误,只有..错误的答案。这是二进制搜索的基本属性

思考一下你的算法:假设所有学生都得了6分。显然,你的目的是打印出所有学生

您的代码将只在两个位置打印。这两个位置位于for循环中,并且它在for循环中打印X次,其中X是“target-shiftPlus”。您的代码不完整(shiftPlus未在任何位置定义),但很明显,如果“目标”改变,打印的数量也会改变。这证明了这是没有意义的:如果你在寻找得分为7的学生,而他们都有7分,那么你会比你在寻找得分为6的学生时多打印一张或少打印一张?不,这不可能是正确的。因此“目标”不应该是be首先是循环计数的一部分,在设计这个算法的过程中,你走错了方向

算法这一部分的重点是“环顾”二进制搜索找到的索引,因为可能有多个学生具有预期分数,如果有多个学生,他们将立即与您的“命中”相邻

一个关键的线索是,在你到达那里之前,你不知道可能会有多少点击,所以一个计数的for循环是正确的。也许一个
while
更合适?一个
for
也可以工作,但是一些索引查找需要成为终止条件的一部分(位于for内部的两个
之间)

假设分数为:[4,6,6,6,7,8],您的binsearch碰巧发现了3个
6
分数中的第一个。换句话说,二进制搜索的结果是:索引=1处存在匹配项

您希望首先“向下看”4(因此,-1相对于您找到的索引:index=0),在索引0处查找分数,即
4
,意识到4不是6,并且不打印任何内容,此外,停止向下看

然后你想“查找”,从你自己的索引(索引=1)开始,获取该索引(
6
)的分数,意识到这实际上是目标索引,所以打印该学生,然后继续:将1添加到你的索引(现在索引=2)然后重复该算法。再次“点击”,打印另一个学生,增加索引,第三次点击,将索引增加到4,获取索引4的分数(
7
),现在失败,因此不会打印任何内容,也不会继续查找。然后,您还需要在没有任何其他索引可查看的边缘情况下进行编程。假设输入是
[4,6,6,6]
,您不希望程序在出现
ArrayIndexOutOfBoundsException
时崩溃,因为您的算法会在列表中继续向下搜索,直到找到一个不是6的数字


我不会把一个功能齐全的程序放在这里,因为这显然是家庭作业,目的是让您学习和理解java,而不是学习和理解CTRL/CMD+C和CTRL/CMD+V键的功能:)

假设您找到了要查找的项目,并且它位于索引
idx
中,因此您可以在其边界等于arr[idx]时进行迭代

leftidx = idx-1;
while(arr[leftidx]==arr[idx]{
   System.out.println(arr[leftidx]);
   lefidx--;
}
rightidx = idx+1;
while(arr[rightidx]==arr[idx]{
   System.out.println(arr[rightidx]);
   rightidx--;
}

不幸的是,我一直无法让它搜索其他成绩相同的学生。不幸的是,这不是一个我们可以帮助解决的问题描述。请查看并相应地增强您的问题。现在看起来怎么样?我对这个平台非常陌生,我理解像我这样的人添加如此多的杂乱内容可能会很烦人。请不要Don’不要使用屏幕截图。这些应该是你的最后手段。确保你的问题包含你正在处理的输入,以及作为文本的输出。从现在起,当我有问题时,我会这样做。谢谢你嗨,谢谢你的帮助,我再次工作,但只有当我输入目标值3时。当输入的目标值为3时,它会打印两个stu得到3分的凹痕。但是如果我说输入6,它只是说构建完成。顺便说一句,感谢你没有发布代码,我宁愿挣扎,然后才能得到答案。无论如何,我更新了代码,如果你能提供一些额外的指导和评论,那将是太好了!@RayaanKhan你的输入排序了吗?