Java比较三个字符串数组并使用Binarysearch

Java比较三个字符串数组并使用Binarysearch,java,arrays,string,algorithm,binary-search,Java,Arrays,String,Algorithm,Binary Search,我有三个长度为9的字符串数组,我想看看它们是否都包含相同的名称。我必须在线性时间O(NlogN)内完成这项工作。我的计划是对两个数组进行排序,然后使用binarysearch查找相似的名称。我的代码是这样的: import edu.princeton.cs.algs4.*; import java.util.Arrays; import java.util.ArrayList; import java.util.List; public class Triplicate2_2_21 {

我有三个长度为9的字符串数组,我想看看它们是否都包含相同的名称。我必须在线性时间O(NlogN)内完成这项工作。我的计划是对两个数组进行排序,然后使用binarysearch查找相似的名称。我的代码是这样的:

import edu.princeton.cs.algs4.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

public class Triplicate2_2_21 {

  // arrays.binarysearh
  public static void main(String[] args) {
    //Strengir sem innihalda 9 nöfn. Sumir innihalda sama nafnið.
    //Nöfn sem eru eins í öllum 3 listunum eru Hulda og Ingi.
    String[] name1 = {"Helgi", "Arnar", "Hulda", "Hrefna", "Ingi", "Marta",
                    "Svavar", "Ester", "Valur"};
    String[] name2 = {"Oddur", "Birgitta", "Hulda", "Ingi", "Selma", "Svavar",
                    "Sylvia", "Unnar", "Hrefna"};
    String[] name3 = {"Elfa", "Jan", "Hulda", "Hrund", "Ingi", "Marta",
                    "Angela", "Sturla", "Valur"};

    Arrays.sort(name2);
    Arrays.sort(name3);

    for(int i = 0; i < name1.length; i++) {
        if((Arrays.binarySearch(name2,name1[i])).compareTo(Arrays.binarySearch(name3,name1[i])) < 0 ) {
          StdOut.println(name1[i]);
          break;
        }}}}
import-edu.princeton.cs.algs4.*;
导入java.util.array;
导入java.util.ArrayList;
导入java.util.List;
公共类三联2_2_21{
//arrays.binarysearh
公共静态void main(字符串[]args){
//9 nöfn.Sumir innihalda sama nafnið。
//Nöfn sem eru einsíllum 3 listunum eru Hulda og Ingi。
字符串[]名称1={“Helgi”、“Arnar”、“Hulda”、“Hrefna”、“Ingi”、“Marta”,
“Svavar”、“Ester”、“Valur”};
字符串[]名称2={“Oddur”、“Birgitta”、“Hulda”、“Ingi”、“Selma”、“Svavar”,
“Sylvia”、“Unnar”、“Hrefna”};
String[]name3={“Elfa”、“Jan”、“Hulda”、“Hrund”、“Ingi”、“Marta”,
“安吉拉”、“斯图拉”、“瓦卢”};
Arrays.sort(name2);
Arrays.sort(name3);
for(int i=0;i
我只想把我找到的第一份三份打印出来,这就是我为什么要打破它的原因。这个代码示例不起作用,我不知道如何进一步实现这个想法。所以,我在这里寻求你的帮助来完成这件事

这是一个家庭作业,问题来自《算法导论》第四版,听起来像这样:

if (Arrays.binarySearch(name2, name1[i]) > -1 && Arrays.binarySearch(name3, name1[i]) > -1) {
                System.out.println(name1[i]);
                break;
            }
        }
重复三次。给出三个分别有N个名字的列表,设计一个线性算法
要确定所有三个列表是否有共同的名称,如果有,请返回第一个“

数组。binarySearch
确实返回int,因此没有
比较方法。您的代码无法编译

要修复它,请更改条件部分,如下所示:

if (Arrays.binarySearch(name2, name1[i]) > -1 && Arrays.binarySearch(name3, name1[i]) > -1) {
                System.out.println(name1[i]);
                break;
            }
        }

当两次搜索都显示一个
find

数组时捕捉这种情况。binarySearch
确实返回一个int,因此没有
比较方法。您的代码无法编译

要修复它,请更改条件部分,如下所示:

if (Arrays.binarySearch(name2, name1[i]) > -1 && Arrays.binarySearch(name3, name1[i]) > -1) {
                System.out.println(name1[i]);
                break;
            }
        }

要抓住两次搜索都发出查找信号的情况,需要记住的一件事是nlog(n)严格地慢于3n,因此仅进行线性搜索要比排序然后进行二进制搜索快得多。所以,如果你不是因为这是家庭作业而选择这样做,请确保在你的帖子中明确这一点,并解释你必须做什么,以及你自己在这方面做了什么。正如@realponsum所指出的:你确定你被要求实现nlog(n)而不是log(n)?我不确定
compareTo
是你在这里需要的。按照您的方法,我可能会选择
binarySearch(..)>=0&&binarySearch(..)>=0
,如果不满足第一个条件,它也会短路。@Mike您如何在3N中搜索所有三个数组都包含任意公共元素?我在天真的方法中至少看到了N平方。这不是我在问题中读到的。它们的描述是“我想看看它们是否都包含相同的名称”,这与“我想看看它们是否至少共享一个元素”不同。因此,如果他们是指后者,他们将不得不更新他们的帖子,以便更准确地了解他们真正需要做什么。作为第一个描述,在第一个列表上没有迭代,您只需选择一个元素,然后检查它是否在其他两个列表中。结果是
true
false
,具有线性运行时间。第二个描述生成元素,如果简单实现,则为二次时间。谢谢您的回答。我稍微编辑了一下这篇文章。我在书中添加了一个问题,我的意思是它应该是线性的,而不是对数的。要记住的一点是nlog(n)严格地比3n慢,所以只进行线性搜索要比排序然后进行二进制搜索快得多。所以,如果你不是因为这是家庭作业而选择这样做,请确保在你的帖子中明确这一点,并解释你必须做什么,以及你自己在这方面做了什么。正如@realponsum所指出的:你确定你被要求实现nlog(n)而不是log(n)?我不确定
compareTo
是你在这里需要的。按照您的方法,我可能会选择
binarySearch(..)>=0&&binarySearch(..)>=0
,如果不满足第一个条件,它也会短路。@Mike您如何在3N中搜索所有三个数组都包含任意公共元素?我在天真的方法中至少看到了N平方。这不是我在问题中读到的。它们的描述是“我想看看它们是否都包含相同的名称”,这与“我想看看它们是否至少共享一个元素”不同。因此,如果他们是指后者,他们将不得不更新他们的帖子,以便更准确地了解他们真正需要做什么。作为第一个描述,在第一个列表上没有迭代,您只需选择一个元素,然后检查它是否在其他两个列表中。结果是
true
false
,具有线性运行时间。第二个描述生成元素,如果简单实现,则为二次时间。谢谢您的回答。我稍微编辑了一下这篇文章。我补充了书中的问题,我的意思是它应该是线性的,而不是对数的。谢谢你的回答,我的代码现在运行良好。谢谢你的回答,我的代码现在运行良好。