2016-09-30 2 views
0

В настоящее время я использую Jersey REST для создания веб-страницы с списком птиц и номера таксономии со ссылкой на страницу, в частности, о птице, о которой идет речь. Пока мои ссылки работают между двумя страницами, появляются имя моей птицы и номер таксономии, я не могу получить имя заказа или фамилии. Ниже приведен код.Получение «нуля» в месте правильных значений

@Path("/birdslist") 
public class BirdsList extends Birds { 

    @GET 
    @Path("/all") 
    @Produces("text/html") 
    public String all() { 
     Iterator iterator = birdnames.keySet().iterator(); 
     String page = "<html><title>All Birds</title><body>"; 
     page += "<p>This is the list of all birds. <br> Click the taxonomy number of the bird you wish to view in detail.</p>"; 
     while(iterator.hasNext()){ 
      Object key = iterator.next(); 
      String value = birdnames.get(key); 
      HashSet fam = family.get(key); 
      HashSet ord = order.get(key); 
     } 
     for (String key : birdnames.keySet()) { 
      page += String.format("<p>Name:%s <br> Taxonomy Number:<a href=%s>%s</a></p>",birdnames.get(key),key, 
      key); 
      getBird(key); 
     } 
     page += "</body></html>"; 
     return page; 
    } 

    @GET 
    @Path("{key}") 
    @Produces("text/html") 
    public String getBird(@PathParam("key") String key) { 
     String page = "<html><title>Bird #: {key}</title><body>"; 
     page += String.format("<p>This page contains info on the %s</p>",birdnames.get(key)); 
     page += String.format("<p>Name:%s <br> Taxonomy Number:%s <br> Family:%s <br> Order:%s</p>",birdnames.get(key),key,family.get(key),order.get(key)); 
     page += "<p>Please click <a href=all>here</a> to return to the list of all birds.</p>"; 
     page += "</body></html>"; 
     return page; 
    } 
} 

Семья и порядок сохраняются в HashSet, который внутри HashMap, в то время как имя птица в HashMap. Он был записан из файла csv и преобразован в хэшмапы. Ниже приведен код.

public class Birds { 

    HashMap<String,String> birdnames;  
    HashMap<String,HashSet<String>> family; 
    HashMap<String,HashSet<String>> order; 

    /** 
    Constructor reads the CSV of all birds 
    */ 
    public Birds() { 
    // long path to eBirds assuming Maven "mvn exec:java" is many levels up 
    String fileName = "src/main/java/com/example/rest/eBirds.csv"; 
    boolean firstLine = true; 
    this.birdnames = new HashMap<String,String>(); 
    this.family = new HashMap<String,HashSet<String>>(); 
    this.order = new HashMap<String,HashSet<String>>(); 
    try { 
     BufferedReader R = new BufferedReader(new FileReader(fileName)); 
     String line; 
     while (true) { 
     line = R.readLine(); 
     if (line == null) break; 
     if (firstLine) { // ignore the first line, it's not a bird 
      firstLine = false; 
      continue; 
      } 
     String[] fields = line.split(","); 
     if (!fields[1].equalsIgnoreCase("species")) continue; // ignore all but species records 
     birdnames.put(fields[0],fields[4]); // add this bird to name table 

     // extract the order name from fields[6] 
     String ordername = fields[6]; 
     if (!order.containsKey(ordername)) { // if needed, create first-time order set   
      order.put(ordername,new HashSet<String>()); 
      } 
     order.get(ordername).add(fields[0]); // new order member by number for lookup 

     // extract the family name from fields[7] -- removing quotes first if needed 
     String famname = fields[7].replace("\"",""); 
     if (!family.containsKey(famname)) { // if needed, create first-time family set   
      family.put(famname,new HashSet<String>()); 
      } 
     family.get(famname).add(fields[0]); // new family member by number for lookup 
     } 
     } 
    catch (IOException e) { System.out.println("Stack trace: " + e); } 
    } 
... 
    } 

Я никогда не использовал HashSets раньше, это было частью данной информации для нас. Наше задание состояло в том, чтобы создать страницу списка и страницы, относящиеся к каждой птице, и ссылку между ними. Я просто не могу заставить эти последние два значения отображаться правильно. Может ли кто-нибудь помочь?

+0

Ваш ключ используется для получения всей информации, но это не то же самое. вы помещаете поле [X] в качестве ключа, которое отличается для X = 0 и X = 7 –

ответ

0

Здесь вы используете один и тот же ключ для всех значений, birdnames, семьи и порядок:

while(iterator.hasNext()){ 
    Object key = iterator.next(); 
    String value = birdnames.get(key); 
    HashSet fam = family.get(key); 
    HashSet ord = order.get(key); 
} 

Но инициализировать их с разными ключами:

// extract the order name from fields[6] 
String ordername = fields[6]; 
if (!order.containsKey(ordername)) 
{ // if needed, create first-time order set   
    order.put(ordername, new HashSet<>()); 
} 
order.get(ordername).add(fields[0]); // new order member by number for lookup 

Здесь ключ будет поля [6 ], а не ключ птичьего имени.

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

if (!order.containsKey(fields[0])) 
{ 
    order.put(fields[0], new HashSet<>()); 
} 
order.get(fields[0]).add(fields[6]); 

Затем вы можете использовать:

HashSet ord = order.get(key); 

И вы получите все заказы это птица name.


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

Set<String> ord = new HashSet<>(); 
for (String tmp : order.keySet()) 
{ 
    if (order.get(tmp).contains(key)) 
     ord.add(tmp); 
} 

Здесь ord будет содержать все заказы на «ключ».

Как вы можете видеть, вам нужно сделать гораздо более избыточную работу, если вы не переключите значение и «ключ».

+0

Итак, так как мои имена заказов и фамилий являются ключами к их соответствующим хэшмапам, есть способ вытащить тех, кто использует номер таксономии (поле [0])? Мне нужно отобразить ключ для hashmap заказа и ключ для семейного hashmap. – CabooseMSG

+0

Возможно, но тогда нет смысла использовать карты, так как быстро получить значение по его ключу, но не по его значению. Если вам нужно это сделать, то что-то совершенно не так в дизайне, который вы (нужно?) Использовать. Почему вы не можете использовать мое предложенное решение? Что не делает этого, что нужно? –

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