2015-03-31 3 views
1

У меня есть класс POJO, Location, который используется для сопоставления файла JSON с классом с использованием Jackson. Текущая реализация может распечатать каждый объект Location в классе, вызвав toString(), но мне интересно, как я могу напечатать, например, только местоположение с id = «2», которое было бы названием = «Desert»Как распечатать содержимое объекта класса по полю?

в настоящее время я использую метод ToString, как это напечатать все содержимое Откуда:

public String toString() { 
     return "Location [location=" + Arrays.toString(location) + ", id=" + id 
       + ", description=" + description + ", weight=" + weight 
       + ", name=" + name + ", exit=" + Arrays.toString(exit) 
       +"]"; 
    } 

кто-нибудь знает, как я могу напечатать определенные местоположения внутри объекта в зависимости от местоположения на поле идентификатора?

Это пример того, что хранится в классе Location, когда я называю ToString() на нем:

http://hastebin.com/eruxateduz.vhdl

Пример одного из мест в пределах объекта Location:

[Location [location=null, id=1, description=You are in the city of Tiberius. You see a long street with high buildings and a castle.You see an exit to the south., weight=100, name=Tiberius, exit=[Exit [title=Desert, direction=South]]] 

Это класс POJO место я использую для отображения JSON полей в классе:

public class Location { 

    private Location[] location; 

    private int id; 

    private String description; 

    private String weight; 

    private String name; 

    private Exit[] exit; 

    private boolean visited = false; 
    private boolean goalLocation; 
    private int approximateDistanceFromGoal = 0; 
    private Location parent; 




    public Location[] getLocation() { 
     return location; 
    } 

    public void setLocation(Location[] location) { 
     this.location = location; 
    } 


    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getDescription() 
    { 
     return description; 
    } 

    public void setDescription (String description) 
    { 
     this.description = description; 
    } 


    public String getWeight() { 
     return weight; 
    } 

    public void setWeight(String weight) { 
     this.weight = weight; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setName (String name) 
    { 
     this.name = name; 
    } 

    public Exit[] getExit() { 
     return exit; 
    } 

    public void setExit(Exit[] exit) { 
     this.exit = exit; 
    } 


    public boolean isVisited() { 
     return visited; 
    } 

    public void setVisited(boolean visited) { 
     this.visited = visited; 
    } 

    public boolean isGoalLocation() { 
     return goalLocation; 
    } 

    public void setGoalLocation(boolean goalLocation) { 
     this.goalLocation = goalLocation; 
    } 

    public int getApproximateDistanceFromGoal() { 
     return approximateDistanceFromGoal; 
    } 

    public void setApproximateDistanceFromGoal(int approximateDistanceFromGoal) { 
     this.approximateDistanceFromGoal = approximateDistanceFromGoal; 
    } 

    public Location getParent() { 
     return parent; 
    } 

    public void setParent(Location parent) { 
     this.parent = parent; 
    } 

    @Override 
    public String toString() { 
     return "Location [location=" + Arrays.toString(location) + ", id=" + id 
       + ", description=" + description + ", weight=" + weight 
       + ", name=" + name + ", exit=" + Arrays.toString(exit) 
       +"]"; 
    } 



} 

ответ

1
<dependency> 
    <groupId>org.apache.commons</groupId> 
    <artifactId>commons-collections4</artifactId> 
    <version>4.0</version> 
</dependency> 

Для определения предиката вам нужна указанная выше зависимость, если вы не хотите делать это самостоятельно.

public class Location { 
    private int id; 
    // more stuff here 

    private Predicate<Integer> filter; 
    public Location() { 
      this.filter = TruePredicate.INSTANCE; 
    } 
    public Location(int idFilter) { 
      this.filter = new EqualPrediate(idFilter); 
    } 

    public String toString() { 
     StringBuilder buffer = new StringBuilder(); 
      if(filter.apply(this.id)) { 
      buffer.append("Location [location=" + Arrays.toString(location) + ", id=" + id 
       + ", description=" + description + ", weight=" + weight 
       + ", name=" + name + ", exit=" + Arrays.toString(exit) 
       +"]"); 
      } 
     return buffer.toString(); 
    } 

} 

Этот код является упрощенным Visitor Pattern где

'Посетитель' -> ваш предикат

'это' -> 'this.id'

это работает потому что ваш toString() вызывает toString() объектов вложенного местоположения, которые также имеют свои предикаты для набора фильтров.

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

public String toString() { 
      StringBuilder buffer = new StringBuilder(); 
      int i = 0; 
      for(Location l = this; i < locations.length; l = locations[i++]) 
       if(filter.apply(l.id) { 
       buffer.append("Location [location=" + Arrays.toString(location) + ", id=" + id 
        + ", description=" + description + ", weight=" + weight 
        + ", name=" + name + ", exit=" + Arrays.toString(exit) 
        +"]"); 
       } 
      return buffer.toString(); 
     } 
+0

На втором месте, в окружении песчаных дюн и ничтожества, вы видите выход на юг. подумал, что мне кажется, что я должен использовать график для представления списка местоположений и мест доступа через методы Location. Я разместил новый вопрос, связанный с созданием графика из списка: http://stackoverflow.com/questions/29403187/how-to-create-a-graph-from-a-list-of-node-objects –

1

У вас может быть попытка с gson, которая вводит объект и выводит JSON или на противоположную сторону.

После того, как вы сделаете объект JSONObject, вы можете эргодизировать JSON для эргодического объекта.

+0

могли бы вы показать пример кода этого? –

+0

@BrianJ u может искать пример 'gson' ' – Turtle

1
Stream.of(location).filters(l -> l.getId() == 2).foreach(System.out::println); 

Это работает?

+0

Говорят, что мне нужно изменить, выполнить проект и JRE до 1.8, это повлияет на мой текущий проект? –

+0

Модернизация виртуальной машины не должна. Но я видел какое-то безумие с размышлениями. Это означает, что если вы собираетесь использовать это в своем производстве, ваше приложение должно быть развернуто на 1,8 и только 1,8 –

+0

в порядке, это не бегун, тогда проект должен быть запущен и развернут на Java 1.5. Есть ли у вас какие-либо другие решения для этой версии Java?:) –

Смежные вопросы