【问题标题】:Receiving "null" in Place of Correct Values接收“null”代替正确值
【发布时间】:2017-02-09 13:11:01
【问题描述】:

我目前正在使用 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;
    }
}

家庭和顺序保存在哈希图中的哈希集中,而鸟名则保存在哈希图中。它是从 csv 文件改写并转换为 hashmaps 的。以下是该代码。

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); }
    }
...
  }

我以前从未使用过 HashSet,这是给我们的信息的一部分。我们的任务是创建一个列表页面和特定于每只鸟的页面以及两者之间的链接。我只是无法正确显示这最后两个值。有人可以帮忙吗?

【问题讨论】:

  • 您使用相同的密钥检索所有信息,但并不相同。你把 field[X] 作为键,这对于 X=0 和 X=7 是不同的

标签: java html rest path jersey


【解决方案1】:

在这里,您对所有值、鸟名、家庭和顺序使用相同的键:

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

这里的键是 fields[6] 而不是 birdnames 键。

如果您想继续使用相同的密钥,您可以对订单执行以下操作:

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

那么你可以使用:

HashSet ord = order.get(key);

您将收到该鸟名的所有订单。


如果您不想更改它并仍然使用相同的密钥,您可以执行以下操作,但强烈建议不要这样做,因为它首先破坏了使用地图的目的:

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

这里的 ord 将包含“key”的所有命令。

如您所见,如果您不切换值和“键”,则需要做更多冗余工作。

【讨论】:

  • 好的,既然我的顺序和姓氏是它们各自哈希图的键,有没有办法使用分类号(字段[0])来提取它们?我需要显示 order hashmap 的 key 和 family hashmap 的 key。
  • 有可能,但是使用映射没有意义,因为通过键检索值而不是通过值检索键很快。如果您需要这样做,那么您(需要?)使用的设计完全错误。为什么你不能使用我提出的解决方案?什么没有做它需要做的事?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
相关资源
最近更新 更多