метод печати в Java - PullRequest
2 голосов
/ 05 мая 2009

Я хочу спросить вас о массиве векторов печати, следующий:

Vector[] routingTable = new Vector[connectivity.length];

Я попробовал этот метод, но он не работает со мной и дает мне protocol.Route@c17164 когда я печатал в основном, вот код, так что вы можете сказать мне, почему он не печатает правильное значение?

public String printRT(int hop)
{
   String s = "";
   for (int i = 0; i < conf.routingTable[hop].size(); i++) 
  {
     s= " ROUTING TABLE " + conf.routingTable[hop].get(i);
  }
  return s;
}

Ответы [ 6 ]

7 голосов
/ 05 мая 2009

похоже, вам нужно реализовать метод toString() в protocol.Route.

class Route {
    public String toString() {
         return "some string that makes sense";
    }
}
6 голосов
/ 05 мая 2009

Либо переопределите метод toString() в классе protocol.Route, либо получите нужные свойства от объекта Route и добавьте их к String s внутри вашего метода printRT.

4 голосов
/ 05 мая 2009

Много полезных предложений, но я думаю, что все упускают что-то очень простое - в каждой итерации цикла вы перезаписываете значение s. Я думаю, что вы хотите сказать что-то вроде следующего:

s += " ROUTING TABLE " + conf.routingTable[hop].get(i);

Обратите внимание на «+ =», а не на простое назначение. Или используйте StringBuilder, или как угодно.

2 голосов
/ 05 мая 2009

Когда вы просите Java напечатать объект, для которого не определен метод toString, он будет использовать реализацию по умолчанию toString в классе Object. Из javadocs:

Метод toString для класса Object возвращает строку, состоящую из название класса, из которого объект является экземпляром, символ знака `@ 'и шестнадцатеричное без знака представление хэш-кода объект. Другими словами, этот метод возвращает строку, равную значению из:

 getClass().getName() + '@' + Integer.toHexString(hashCode())

В вашем примере «protocol.Route» будет именем класса, а «c17164» - это то, что возвращает метод hashcode в виде hexString, который, если hashCode не был перезаписан, вероятно, является адресом объекта, хотя это реализация зависимый.

Итак, есть несколько способов решить вашу проблему.

  1. Напишите свою собственную реализацию метода toString для класса Route, который печатает нужные данные. Это, наверное, самый «правильный» способ решения вашей проблемы. Он хранит вещи, хорошо инкапсулированные в классе, означая, что только метод toString внутри класса должен знать точные переменные-члены, которые должны быть напечатаны.

  2. Если ситуация такова, что вы не можете изменить класс Route, вы можете создать подкласс для своей собственной версии класса Route, к которой вы можете добавить метод toString. Однако, в зависимости от дизайна класса, это может быть сложно.

  3. Попросите текущий метод printRT заглянуть внутрь каждого объекта Route и получить конкретную информацию, которую вы хотите добавить к текущей строке.

Также обратите внимание, что с текущим кодом вы записали следующее во внутренний цикл:

  s= " ROUTING TABLE " + conf.routingTable[hop].get(i);

Это означает, что printRT будет возвращать только строку для самой последней итерации цикла. Таким образом, большую часть времени в цикле for тратится на создание строк, присвоение их переменной, а затем их перезапись в следующий раз в цикле.

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

  s += " ROUTING TABLE " + conf.routingTable[hop].get(i);

Теперь новая информация добавляется в s каждый раз через цикл. Однако, в зависимости от количества выполняемых конкатенаций строк, класс StringBuilder может быть лучшей альтернативой (см. Краткое резюме и учебное пособие по нему здесь ).

1 голос
/ 05 мая 2009

Два варианта.

Либо переопределите метод toString() класса protocol.Route.

public String toString() {
    return someMethodorPropertyThatreturnsString;
}

или получите требуемые свойства / методы из объекта Route и добавьте их к строке s внутри вашего printRT метода.

public String printRT(int hop)
{
  String s = "";
  for (int i = 0; i < conf.routingTable[hop].size(); i++) 
  {
     s= " ROUTING TABLE " +     conf.routingTable[hop].get(i).someMethodorPropertyThatreturnsString;
  }
  return s;
}
0 голосов
/ 05 мая 2009

Здесь есть ряд проблем.

  • Вы должны указать тип для добавления в List с помощью Generics . Таким образом, вы сделаете более очевидным для себя и других то, что вы вкладываете в свои List.

  • Как уже упоминалось, ваш List - это список protocol.Route объектов, а не String s. Когда вы пытаетесь добавить Route к s, Java не знает, как преобразовать его в String, поэтому он использует значение по умолчанию Object#toString(). Переопределите это в Route, чтобы сделать то, что вы хотите.

  • Похоже, вы потенциально будете много добавлять здесь. Используйте StringBuilder.

  • Мне кажется, printRT(int) должен быть методом внутри того, что есть conf.

  • Возможно, вам следует использовать другую реализацию List; Vector на самом деле больше не рекомендуется использовать, поэтому обратите внимание на другие опции, такие как ArrayList.

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