Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
帮助搜索二维数组(Java)_Java_Arrays_Search_Multidimensional Array - Fatal编程技术网

帮助搜索二维数组(Java)

帮助搜索二维数组(Java),java,arrays,search,multidimensional-array,Java,Arrays,Search,Multidimensional Array,我完全迷路了。我在谷歌上搜索这个问题已经有30分钟了,但我找不到任何特定于java的解决方案,也找不到任何跨到java的解决方案 我尝试使用通用的两个简单for循环遍历每个字符串,但它似乎只在搜索项位于数组的第一列时返回结果 public static String search(String term) { String result = ""; int row = db.bookdb.length; for (int i=0; i&l

我完全迷路了。我在谷歌上搜索这个问题已经有30分钟了,但我找不到任何特定于java的解决方案,也找不到任何跨到java的解决方案

我尝试使用通用的两个简单for循环遍历每个字符串,但它似乎只在搜索项位于数组的第一列时返回结果

    public static String search(String term) {
        String result = "";
        int row = db.bookdb.length;

        for (int i=0; i<db.bookdb.length; i++) {
            for (int j=0; j<4; j++) {
                if (term.equals(db.bookdb[i][j])) {
                     row = i;
                     break;
                }
            }
        }

        if (row == db.bookdb.length) {
            result += "Your search failed to return any results";
        }
        else {
            for (int j=0; j<4; j++) {
                result += db.bookdb[row][j] + "    ";
            }
        }

        return result;
    }
db是我正在使用的对象,bookdb是所述对象中的2D数组。是的,列的数量总是4


如果你们还需要其他信息,请随时询问。

你们的搜索方法很好。我创建了一个类,并使用你的搜索方法复制和粘贴,我甚至没有改变你的搜索,它的工作。这让我相信问题在于如何输入数据

class Pdeuchler {

    static Pdeuchler db;

    String[][] bookdb;


    public static String search(String term) {
        String result = "";
        int row = db.bookdb.length;

        outer_loop: // CHANGE #1 added a named loop
        for (int i=0; i<db.bookdb.length; i++) {
            for (int j=0; j<4; j++) {
                if (term.equals(db.bookdb[i][j])) {
                     row = i;
                     //break; //REMOVED
                     break outer_loop; // CHANGE #2 breaking to the outer_loop
                }
            }
        }

        if (row == db.bookdb.length) {
            result += "Your search failed to return any results";
        }
        else {
            for (int j=0; j<4; j++) {
                result += db.bookdb[row][j] + "    ";
            }
        }

        return result;
    }

    public static void main(String[] args) {
        db = new Pdeuchler();
        db.bookdb = new String[10][4]; // title, author, publisher, year

        db.bookdb[0] = new String[] {"Awesome Book","Stan","West","2001"};
        db.bookdb[1] = new String[] {"Cool Story","Dan","North","2002"};
        db.bookdb[2] = new String[] {"Brothers","North","North","2003"};
        db.bookdb[3] = new String[] {"Never again!","Bob","West","2004"};
        db.bookdb[4] = new String[] {"Howdy Partner","Stan","South","2005"};
        db.bookdb[5] = new String[] {"What the StackOverflow?","Dan","North","2006"};
        db.bookdb[6] = new String[] {"That's hilarious","Angie","South","2007"};
        db.bookdb[7] = new String[] {"I like pie","Angie","East","2008"};
        db.bookdb[8] = new String[] {"Bob writes a book","Bob","South","2009"};
        db.bookdb[9] = new String[] {"The adverntures of Bob","Bob","North","2010"};

        System.out.println(search("I like pie"));
        System.out.println(search("North"));
        System.out.println(search("Dan"));
    }

}
变化的结果是:

C:\junk>javac Pdeuchler.java

C:\junk>java Pdeuchler
I like pie    Angie    East    2008
Cool Story    Dan    North    2002
Cool Story    Dan    North    2002

C:\junk>
如果我们使用我称之为search2的高级搜索方法,我们会得到以下结果:

C:\junk>java Pdeuchler
simple search:
I like pie    Angie    East    2008
Cool Story    Dan    North    2002
Cool Story    Dan    North    2002

advanced search:
I like pie    Angie    East    2008

Cool Story    Dan    North    2002
Brothers    North    North    2003
What the StackOverflow?    Dan    North    2006
The adverntures of Bob    Bob    North    2010

Cool Story    Dan    North    2002
What the StackOverflow?    Dan    North    2006


C:\junk>
以下是高级搜索方法:

public static String search2(String term) {
    String result = "";
    int row = db.bookdb.length;

    for (int i=0; i<db.bookdb.length; i++) {
        for (int j=0; j<4; j++) {
            if (term.equals(db.bookdb[i][j])) {
                 row = i;
                 for (int k=0; k<4; k++) {
                     result += db.bookdb[i][k] + "    ";
                 }
                 result += "\n";
                 break; // breaks out of the INNER (j) loop
            }
        }
    }

    if (row == db.bookdb.length) {
        result += "Your search failed to return any results";
    }
    return result;
}

你的搜索方法很好。我创建了一个类,并使用你的搜索方法复制和粘贴,我甚至没有改变你的搜索,它的工作。这让我相信问题在于如何输入数据

class Pdeuchler {

    static Pdeuchler db;

    String[][] bookdb;


    public static String search(String term) {
        String result = "";
        int row = db.bookdb.length;

        outer_loop: // CHANGE #1 added a named loop
        for (int i=0; i<db.bookdb.length; i++) {
            for (int j=0; j<4; j++) {
                if (term.equals(db.bookdb[i][j])) {
                     row = i;
                     //break; //REMOVED
                     break outer_loop; // CHANGE #2 breaking to the outer_loop
                }
            }
        }

        if (row == db.bookdb.length) {
            result += "Your search failed to return any results";
        }
        else {
            for (int j=0; j<4; j++) {
                result += db.bookdb[row][j] + "    ";
            }
        }

        return result;
    }

    public static void main(String[] args) {
        db = new Pdeuchler();
        db.bookdb = new String[10][4]; // title, author, publisher, year

        db.bookdb[0] = new String[] {"Awesome Book","Stan","West","2001"};
        db.bookdb[1] = new String[] {"Cool Story","Dan","North","2002"};
        db.bookdb[2] = new String[] {"Brothers","North","North","2003"};
        db.bookdb[3] = new String[] {"Never again!","Bob","West","2004"};
        db.bookdb[4] = new String[] {"Howdy Partner","Stan","South","2005"};
        db.bookdb[5] = new String[] {"What the StackOverflow?","Dan","North","2006"};
        db.bookdb[6] = new String[] {"That's hilarious","Angie","South","2007"};
        db.bookdb[7] = new String[] {"I like pie","Angie","East","2008"};
        db.bookdb[8] = new String[] {"Bob writes a book","Bob","South","2009"};
        db.bookdb[9] = new String[] {"The adverntures of Bob","Bob","North","2010"};

        System.out.println(search("I like pie"));
        System.out.println(search("North"));
        System.out.println(search("Dan"));
    }

}
变化的结果是:

C:\junk>javac Pdeuchler.java

C:\junk>java Pdeuchler
I like pie    Angie    East    2008
Cool Story    Dan    North    2002
Cool Story    Dan    North    2002

C:\junk>
如果我们使用我称之为search2的高级搜索方法,我们会得到以下结果:

C:\junk>java Pdeuchler
simple search:
I like pie    Angie    East    2008
Cool Story    Dan    North    2002
Cool Story    Dan    North    2002

advanced search:
I like pie    Angie    East    2008

Cool Story    Dan    North    2002
Brothers    North    North    2003
What the StackOverflow?    Dan    North    2006
The adverntures of Bob    Bob    North    2010

Cool Story    Dan    North    2002
What the StackOverflow?    Dan    North    2006


C:\junk>
以下是高级搜索方法:

public static String search2(String term) {
    String result = "";
    int row = db.bookdb.length;

    for (int i=0; i<db.bookdb.length; i++) {
        for (int j=0; j<4; j++) {
            if (term.equals(db.bookdb[i][j])) {
                 row = i;
                 for (int k=0; k<4; k++) {
                     result += db.bookdb[i][k] + "    ";
                 }
                 result += "\n";
                 break; // breaks out of the INNER (j) loop
            }
        }
    }

    if (row == db.bookdb.length) {
        result += "Your search failed to return any results";
    }
    return result;
}

您确定db.bookdb.length不总是1吗

这可能会帮助您:

int[][]矩阵=新int[10][30]; System.out.println行数=+matrix.length;
System.out.println列数=+矩阵[0]。长度

您确定db.bookdb.length不总是1吗

这可能会帮助您:

int[][]矩阵=新int[10][30]; System.out.println行数=+matrix.length;
System.out.println列数=+矩阵[0]。长度

您的break语句脱离内部循环,而不是外部循环。重新这样写:

boolean found = false;

for (int i = 0; i < db.bookdb.length && !found; i ++) {
  for (int j=0; j<4 && !found; j++) {
    if (yourCondition) {
      row = i;
      found = true;
    }
  }
}

您的break语句脱离内部循环,但不脱离外部循环。重新这样写:

boolean found = false;

for (int i = 0; i < db.bookdb.length && !found; i ++) {
  for (int j=0; j<4 && !found; j++) {
    if (yourCondition) {
      row = i;
      found = true;
    }
  }
}

我不确定bookdb的类型,但您可以更改它

private static int searchTermInArray(String[][] bookdb, String term) {
    for (int i=0; i<bookdb.length; i++) {
        for (int j=0; j<4; j++) {
            if (term.equals(bookdb[i][j])) {
                return i;
            }
        }
    }
    return -1;
}

public static String search(String term) {
    String result = "";
    int row = searchTermInArray(db.bookdb, term);
    if (row == -1) {
        result += "Your search failed to return any results";
    }
    else {
        for (int j=0; j<4; j++) {
            result += db.bookdb[row][j] + "    ";
        }
    }

    return result;
}

我不确定bookdb的类型,但您可以更改它

private static int searchTermInArray(String[][] bookdb, String term) {
    for (int i=0; i<bookdb.length; i++) {
        for (int j=0; j<4; j++) {
            if (term.equals(bookdb[i][j])) {
                return i;
            }
        }
    }
    return -1;
}

public static String search(String term) {
    String result = "";
    int row = searchTermInArray(db.bookdb, term);
    if (row == -1) {
        result += "Your search failed to return any results";
    }
    else {
        for (int j=0; j<4; j++) {
            result += db.bookdb[row][j] + "    ";
        }
    }

    return result;
}

你需要打破这两个循环。您可以使用say main for标记外部循环,并在中断后使用该标签

public static String search(String term) {
    String result = "";
    int row = db.bookdb.length;

    mainfor: for (int i=0; i<db.bookdb.length; i++) {
        for (int j=0; j<4; j++) {
            if (term.equals(db.bookdb[i][j])) {
                 row = i;
                 break mainfor;
            }
        }
    }
 ... //rest of your code as is
}

你需要打破这两个循环。您可以使用say main for标记外部循环,并在中断后使用该标签

public static String search(String term) {
    String result = "";
    int row = db.bookdb.length;

    mainfor: for (int i=0; i<db.bookdb.length; i++) {
        for (int j=0; j<4; j++) {
            if (term.equals(db.bookdb[i][j])) {
                 row = i;
                 break mainfor;
            }
        }
    }
 ... //rest of your code as is
}

这样做的唯一结果是:1搜索整个数组,找到最后一个结果,而不是第一个结果;2搜索整个数组,因此需要更长的时间。这只会在同一术语多次存在的情况下对输出产生影响。我应该澄清,这并不意味着这不是一个体面的建议,它只是不能解决老年退休金计划的问题。我还应该指出,您可以使用命名循环并打破它。外循环:forint i=0。。。然后打破外环;感谢您捕捉到了这一点,但它仍然没有修复glowcoder指出的bug。速度不是问题,最多只能搜索由少于20个字符组成的12x4字符串数组。另外,我假设只有一个可能的结果,唯一的结果是1你搜索整个数组,所以你找到最后一个结果,而不是第一个,2你搜索整个数组,所以需要更长的时间。这只会在同一术语多次存在的情况下对输出产生影响。我应该澄清,这并不意味着这不是一个体面的建议,它只是不能解决老年退休金计划的问题。我还应该指出,您可以使用命名循环并打破它。外循环:forint i=0。。。然后打破外环;感谢您捕捉到了这一点,但它仍然没有修复glowcoder指出的bug。速度不是问题,最多只能搜索由少于20个字符组成的12x4字符串数组。另外,我假设只有一个可能的结果。您的搜索没有中断。我测试了它,见下文。我猜您的bookdb中的输入被破坏了,总是将数据放在第一列。您的搜索没有被破坏。我测试了它,见下文。我猜您的bookdb中的输入被破坏了,总是将数据放在第一列。我仔细检查了我的数组,发现字符串中有多余的空格。哦。谢谢,谢谢你的帮助。@pdechuler当然。我将对上面的代码进行两次编辑,然后粘贴结果。问问你的教授他们是否可以使用,因为有些人会不同意。如果他说没问题,我会用的。如果他说不行,我会把iluxa的答案加入到你的循环中。@pdechuler我做了改变。你看到它的作用了吗?一旦找到一个可接受的匹配项,它就通过中断外部的_循环来退出循环。这意味着您现在可以找到数组的第一个结果,而不是最后一个结果。因此,如果在第一个结果中找到匹配项,则不会搜索整个数组。另一种选择是始终搜索数组并
找到所有匹配的元素。我也会在中编辑它。@pdechuler添加了高级search@pdechuler老实说,它们只是一些小的调整。你原来的搜索方法很好。当你开始学习Java课程时,呵呵。。。如果它起作用,那就是对的。当我还在大学的时候,我帮助一个朋友给一些CS101作业打分,而且。。。我很惊讶。我仔细检查了我的数组,发现字符串中有多余的空格。哦。谢谢,谢谢你的帮助。@pdechuler当然。我将对上面的代码进行两次编辑,然后粘贴结果。问问你的教授他们是否可以使用,因为有些人会不同意。如果他说没问题,我会用的。如果他说不行,我会把iluxa的答案加入到你的循环中。@pdechuler我做了改变。你看到它的作用了吗?一旦找到一个可接受的匹配项,它就通过中断外部的_循环来退出循环。这意味着您现在可以找到数组的第一个结果,而不是最后一个结果。因此,如果在第一个结果中找到匹配项,则不会搜索整个数组。另一种选择是始终搜索数组并找到所有匹配的元素。我也会在中编辑它。@pdechuler添加了高级search@pdechuler老实说,它们只是一些小的调整。你原来的搜索方法很好。当你开始学习Java课程时,呵呵。。。如果它起作用,那就是对的。当我还在大学的时候,我帮助一个朋友给一些CS101作业打分,而且。。。我很惊讶。简直是惊讶。