Помощь в поиске 2D-массива (Java) - PullRequest
1 голос
/ 29 марта 2011

Я полностью потерян.Я погуглил эту проблему в течение, возможно, 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)

Если есть какая-либо дополнительная информация, которую вам, ребята, нужно спрашивать.

Ответы [ 5 ]

2 голосов
/ 29 марта 2011

ваш оператор "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;
    }
  }
}
2 голосов
/ 29 марта 2011

Ваш метод поиска работает нормально. Я создал класс и использовал ваш метод поиска (COPIED AND PASTED, я даже не изменил ваш поиск), и он работает. Это наводит меня на мысль, что проблема в том, как вы вводите свои данные.

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>java Pdeuchler
I like pie    Angie    East    2008
The adverntures of Bob    Bob    North    2010
What the StackOverflow?    Dan    North    2006

C:\junk>

и результаты с изменением:

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;
}
0 голосов
/ 29 марта 2011

Вам нужно вырваться из обеих петель. Вы можете пометить внешний цикл, скажем, «mainfor» и использовать эту метку после перерыва

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 голосов
/ 29 марта 2011

Я не уверен, какой у вас тип 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;
}
0 голосов
/ 29 марта 2011

Вы уверены, что db.bookdb.length не всегда равен 1?

Это может помочь вам:

int [] [] matrix = new int [10] [30]; System.out.println ("Количество строк =" + matrix.length); System.out.println ("Количество столбцов =" + матрица [0]. Длина);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...