带有标记值的分区列表

时间:2013-11-07 17:27:06

标签: java collections

我有一个数组列表,其中包含

等值
{ "november", "a","b","c","d", "december", "i","j","k", "april", "g","h" }

分割它的最佳方法是什么,所以我可以根据月份使用不同的数组。例如

List<String> novemberArray={"a","b","c","d"}

List<String> decemberArray={"i","j","k"}` 

等。

我从使用Jsoup解析html页面获取此列表。

Elements tableRowElements = tableElements.select(":not(thead) tr");
for (int i = 0; i < tableRowElements.size(); i++) {
  Element row = tableRowElements.get(i);
  System.out.println("row : " );
  Elements rowItems = row.select("tr");
  for (int j = 1; j < rowItems.size(); j++) {
    System.out.println(rowItems.get(j).text());
    myList.add(rowItems.get(j).text());
  }
}

myList的值为{ "november", "a","b","c","d", "december", "i","j","k", "april", "g","h" } 列表是动态的,我对列表中的位置没有任何控制权。使用子索引无济于事,因为它们经常变化。

4 个答案:

答案 0 :(得分:1)

一种方法是 找到开始和结束索引并使用subList(int fromIndex, int toIndex)来查看原始列表的一部分。

来自API:

  

返回指定列表中此列表部分的视图   fromIndex,inclusive,toIndex,exclusive。 (如果fromIndex和   toIndex相等,返回的列表为空。)返回的列表是   此列表支持,因此返回列表中的非结构更改   反映在此列表中,反之亦然。返回的列表支持   此列表支持的所有可选列表操作。

答案 1 :(得分:1)

所以你有一个ArrayList包含数据("a""b",等等)和 哨兵值("november"等。 )? Orel Eraki的评论很明显,你在处理这样的数据时遇到了麻烦。如果可以的话,你会发现完全没有这种方法的痛苦。

但是,假设你无法改变它,这就是你如何摆脱它。我使用了Guava Multimap,我强烈建议您也这样做,但您可以在HashMap<String, ArrayList<String>>中替换一些额外的样板。

public ListMultimap<String,String> removeSentinels(List<String> ls,
                                                   Set<String> sentinels) {
  String currentSentinel = null;
  ArrayListMultimap<String,String> map = ArrayListMultimap.create();
  for(String s : ls) {
    if(sentinels.contains(s)) {
      currentSentinel = s;
    } else {
      /*
      Note if the list doesn't start with a sentinel value, it will put items in the
      null entry.  You could instead do a null check here and raise an exception, or
      use an ImmutableListMultimap which forbids null keys or values.
      */
      map.put(currentSentinel, s);
    }
  }
  return map;
}

然后,您可以使用List<String> novemberList = map.get("november");等来获取元素。


您的JSoup示例解释了潜在的概念问题。您正在获取2D表数据并将其读入1D列表。我在上面描述的相同行为可用于从一开始就更清晰地将此表数据解析为Multimap,从而避免以后需要重新解析(或者,Guava还提供Table接口,但这对你的用例来说可能有点过分了):

public ListMultimap<String,String> tableToMap(Document doc) {
  Elements trElems = doc.select(":not(thead) tr");
  ArrayListMultimap<String,String> map = ArrayListMultimap.create();
  for(Element tr : trElems) {
    // I assume you meant td, a <tr> shouldn't contain <tr>'s
    Elements tdElems = tr.select("td");
    String month = tdElems.get(1).text(); // You skip index 0, presumably intentionally
    for(int i = 2; i < tdElems.size(); i++) {
      map.put(month, tdElems.get(i).text());
    }
  }
  return map;
}

答案 2 :(得分:0)

创建一个String to List的地图,将月份作为键,并将a,b,c等列表作为值。

循环遍历ArrayList并根据一个列表或一组月字符串(&#34;一月&#34;,&#34;二月&#34;,...)检查每个条目,每次遇到肯定匹配然后设置一个&#39; currentMonth&#39;变量到匹配的月份,并为地图中的每个非月变量添加/更新相应的列表条目。

伪代码:

If (entry is month) {
    currentMonth = entry;
} else {
    List entries = monthMap.get(currentMonth) == null ? new ArrayList<>() : monthMap.get(currentMonth)
    entries.add(entry)
    monthMap.put(currentMonth, entries)
}

答案 3 :(得分:-1)

这里是外行人的方法

import java.util.*;

public class One {
    public static void main(String[] args) 
    {
        String[] inputArray = new String[]{ "november", "a","b","c","d","december", "i","j","k","april", "g","h"};
        List<String> monthNames = new ArrayList<String>();
        List<String> monthNamesOutput = new ArrayList<String>();
        List<String> alphabetsOutput = new ArrayList<String>();
        monthNames.add("january");
        monthNames.add("february");
        monthNames.add("march");
        monthNames.add("april");
        monthNames.add("may");
        monthNames.add("june");
        monthNames.add("july");
        monthNames.add("august");
        monthNames.add("september");
        monthNames.add("october");
        monthNames.add("november");
        monthNames.add("december");
        for(String temp:inputArray)
        {
            if(monthNames.contains(temp))
            {
                monthNamesOutput.add(temp);
            }
            else
            {
                alphabetsOutput.add(temp);
            }
        }
        System.out.println(monthNamesOutput);
        System.out.println(alphabetsOutput);
    }
}