Перебор 2D массива в Java - PullRequest
0 голосов
/ 02 июня 2010

Здравствуйте, у меня есть проблема, и я хочу, чтобы у вас была помощь. У меня есть таблица, которая называется citylink [10] [2] и я хочу сделать проверку, прежде чем двигаться дальше в своем коде, если он полон, чтобы продолжить, если он не прерывается !! Я знаю, что должен использовать цикл if, но я не знаю, что в него вставить !!

EDIT

for(int i=0; i < citylink.length; i++) {
  if(citylink[][]) {
    body=pF.fetchPage(citylink[i][1]);
  }
}

сначала я хочу проверить, заполнена ли в моей таблице данные или хотя бы 5 первых столбцов !!!, а затем вставить в тело и использовать эту команду

Ответы [ 3 ]

5 голосов
/ 02 июня 2010

Вам следует рассмотреть возможность использования java.util.List вместо массивов ( Effective Java 2nd Edition, пункт 25. Предпочитать списки массивам ). Похоже, вы также используете 2-элементный массив для представления "городской ссылки"; это не лучшая модель для ваших данных.

Вы должны определить class CityLink, возможно, что-то вроде этого:

public class CityLink {
   final City source;
   final City destination;
   //...
}

Тогда вы объявляете List<CityLink>.

API ссылки

  • java.util.List<E>
    • int size() - возвращает количество элементов в этом списке.
    • E get(int index) - Возвращает элемент в указанной позиции в этом списке.
    • add(E e) - добавляет указанный элемент в конец этого списка
  • java.util.ArrayList<E>
    • Реализация массива изменяемого размера интерфейса List.

На счету вещей

Если вы настаиваете на использовании массивов, то вы должны вести подсчет того, сколько элементов в массиве являются «настоящими» элементами. Самый простой способ сделать это - иметь значение int count = 0;, которое вы увеличиваете каждый раз, когда добавляете элемент в массив.

В любой момент времени единственными «реальными» элементами в массиве являются arr[i], где i изменяется от 0 (включительно) до count (исключая). Если count == arr.length;, то массив заполнен и больше не может содержать какие-либо дополнительные элементы.

Опять же, нужно сказать, что это ужасный способ решения вашей нынешней проблемы, который в будущем приведет только к еще большему количеству проблем. Вы действительно должны использовать List.


По столбцам и строкам

или хотя бы 5 первых столбцов!

Учитывая это объявление:

int[][] table = new int[10][20];

Традиционно считается, что table имеет 10 строк, по 20 столбцов в каждой строке.

2 голосов
/ 02 июня 2010

Если я правильно вас понимаю, вы должны убедиться, что все ссылки в вашей таблице инициализированы, прежде чем передавать каждую из них методу.

Если вы действительно хотите использовать массивы, код может выглядеть примерно так:

for(int i=0; i < citylink.length; i++) {
  for(int j=0; j < citylink[i].length; j++) {
    if(citylink[i][j] == null) {
      citylink[i][j] = ...
    }
    body=pF.fetchPage(citylink[i][j]);
  }
}

Но я согласен с @poly в том, что списки предпочтительнее. Единственной убедительной причиной использования массивов может быть обратная совместимость с устаревшим кодом. Другой случай, если вам нужны конкретные ссылки, связанные с определенными индексами в вашей коллекции; Вы не можете сделать это легко со списками, потому что список не может иметь «дыр». Но тогда вам, вероятно, лучше с картой .

0 голосов
/ 02 июня 2010

Вы определенно хотите избежать проблем с NullPointerException в своем коде, поэтому вы можете добавить проверку перед вызовом fetchPage или . Возможно, вы захотите добавить дополнительный код в метод fetchPage, который я бы предпочел в любом случае.

for(int i=0; i < citylink.length; i++) {
  if(citylink[i][1] != null) {
    body=pF.fetchPage(citylink[i][1]);
  }
}

- самое простое решение для вашей проблемы. Более элегантное решение - реализовать новый метод проверки строки ситилинка:

  //... inside some method
  for(int i=0; i < citylink.length; i++) {
    if(isValidCitylink(citylink[i])) {
      body=pF.fetchPage(citylink[i][1]);
    }
  }
  // ... more of this method
}

private boolean isValidCitylink(String[] citylink) {

  // check null or wrong format
  if (citylink == null || citylink.length != 2) return false;

  // check if both column contain a value
  if (citylink[0] == null || citylink[1] == null) return false

  return true;
}

Вот что я бы предложил (взяв код из предыдущего вопроса):

public String fetchPage(String url) {
    try {
        if (url != null) { // a null value check
          return URIUtil.encodeQuery(url);
        } else {
          return "No URL available";
        }
    } catch (URIException e) {
        e.printStackTrace();
    }
}

Имейте в виду, что в этом коде каждое присвоение body заменяет его предыдущее содержимое, и это тело будет содержать content последнего действительного URL-адреса ситилинка вашего списка / массива.

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