使用Markov方法hashmap组装字符串列表

时间:2017-11-01 00:57:45

标签: java arraylist hashmap

我给了一个哈希映射,其中包含字符串列表的键,其中包含两个字符串和具有不同字符串数量的字符串列表值。我必须汇编并返回hashmap值的字符串列表,除非值包含多个字符串,在这种情况下,该元素应该是列表中的随机字符串。

换句话说,from selenium import webdriver driver = webdriver.PhantomJS() driver.get("http://www.python.org") driver.save_screenshot('screen.png') exit() (每个字母是一个字符串)的地图将返回元素<[a, b], b> | <[b, c], d> | <[c, d], [e, f, g]> | <[d, e], f>的字符串列表,其中x是随机选择的e,f或g。 还可以假设地图中的第一个键是长度为2的字符串列表,其中两个元素都是“”,最终值是长度为1的字符串列表,其中包含“”(参见底部) )。以下是代码。

[b, d, x, f]

这里的问题是它应该通过AssertEquals等从单独的程序传递测试。问题是我得到一个断言错误,说“不符合aa”。我无法理解它的期望,我无法看到我的程序如何不返回我上面指定的内容。相关的行是:

  static ArrayList<String> generateText(Map<List<String>, List<String>> whatComesNext, Random r) {
    List<List<String>> listKey = new ArrayList<List<String>>();
    ArrayList<String> ret = new ArrayList<String>();
    int x;
    ret.add("<START>");
    ret.add("<START>");
    for (List<String> key : whatComesNext.keySet())
        listKey.add(key);
    for (int i=0; i<whatComesNext.size()-1; i++)
      if (listKey.get(i).size()>1) {
        x=r.nextInt(listKey.get(i).size());
        ret.add(listKey.get(i).get(x)); }
      else ret.add(listKey.get(i).get(0));
    return ret;
  }

而测试的其余部分看起来像这样。

Pattern pattern = Pattern.compile("(ab)+c");
    int [] histogram = new int[10];
    for(int i = 0; i < 128; i++) {
      List<String> result = MarkovText.generateText(whatComesNext, new Random(197*i));
      result = MarkovText.excludeStartAndEndMarkers(result);
      assertEquals(1, result.size() % 2);
      int repeats = (result.size()-1)/2;
      if (repeats < histogram.length)
        histogram[repeats] = histogram[repeats]+1;
      StringBuffer together = new StringBuffer();
      for(String w : result) 
        together.append(w);
      assertTrue("Doesn't match " + together, pattern.matcher(together).matches());

编辑:地图是在程序的早期创建的,来自单独的给定字符串列表。对于该程序的这一部分,列表具有以下要素:[“[START]”,“[START]”,“a”,“b”,“a”,“b”,“c”,“[END] ]“]其中每个键是一对两个连续元素,值是该对后面的元素。

0 个答案:

没有答案