开发者

Help Searching a 2D Array (Java)

I'm completely lost. I've googled for this problem for possibly 30 minutes now, and I can't find any java specific solutions (or any solutions that crossover into java).

I've tried using the generic two simple for loops for going through each individual String, but it only seems to return resul开发者_JS百科ts if the search term is in the first column of the array.

    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 is the object i'm working with, and bookdb is the 2D array within said object. (and yes, the amount of columns will always be 4)

If there's any additional information you guys need feel free to ask.


Your search method works fine. I created a class and used your Search method (COPIED AND PASTED, I didn't even change your search) and it works. This leads me to believe the problem is in how you're entering your data.

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

}

And the results:

C:\junk>java Pdeuchler
I like pie    Angie    East    2008
The adverntures of Bob    Bob    North    2010
What the StackOverflow?    Dan    North    2006

C:\junk>

and the results with the change:

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>

If we use an advanced search method (which I'm calling search2) we get this:

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>

Here's the advanced search method:

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


your "break" statement breaks out of the inner loop but not outer one. re-write like this:

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


Are you sure db.bookdb.length isn't always 1?

This might help you:

int[][] matrix = new int[10][30]; System.out.println("Number of rows = " + matrix.length); System.out.println("Number of columns = " + matrix[0].length);


I'm not sure what your bookdb is type but you can change it

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


You need to break out of both the loops. You can label the outer loop with say "mainfor" and use that label after the break

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
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜