在不同的数组中过滤Arraylist

时间:2016-03-10 14:30:53

标签: java android arraylist

我想将单个数组过滤成部分。假设我有一个ArrayList的字符串:

 Array1  = ["2015-01-06","2015-04-06",
    "2016-06-06","2016-01-06",
    "2016-05-06","2017-02-06",
    "2017-04-06","2017-03-06",
    "2015-03-06","2016-04-06",
    "2016-02-06","2015-05-06",
    "2015-01-06","2016-06-06"]

我希望它根据年份过滤新数组,以便输出看起来像:

arrayA = ["2015-01-06","2015-04-06","2015-03-06","2015-05-06","2015-01-06"]
arrayB = ["2016-06-06","2016-01-06","2016-05-06","2016-04-06","2016-02-06","2016-06-06"]
arrayC = [""2017-02-06","2017-04-06","2017-03-06""]

阵列基于多年。我不知道完成这项任务的正确方法。

3 个答案:

答案 0 :(得分:10)

这个问题被编辑为包含Android标记,因为Android不支持Java 8,因此不适用于此问题,我会留下它,以防万一它可以帮助不使用Android的人

使用Stream API,您可以轻松构建每个密钥为一年的Map<Integer, List<String>>。您可以使用groupingBy(classifier)分类器从日期中提取年份。在这种情况下,使用LocalDate.parse解析日期,但您可以通过提供自己的格式化程序轻松扩展它。

public static void main(String[] args) {
    String[] array = {"2015-01-06","2015-04-06",
                      "2016-06-06","2016-01-06",
                      "2016-05-06","2017-02-06",
                      "2017-04-06","2017-03-06",
                      "2015-03-06","2016-04-06",
                      "2016-02-06","2015-05-06",
                      "2015-01-06","2016-06-06"};

    Map<Integer, List<String>> map =
        Arrays.stream(array)
              .collect(Collectors.groupingBy(s -> LocalDate.parse(s).getYear()));
              // or a simple s -> Integer.valueOf(s.substring(0, s.indexOf('-'))) in this case
}

然后,您可以从该地图访问所需的列表。

答案 1 :(得分:4)

这将每年创建一个ArrayList

ArrayList<String> array1 = new ArrayList<String>();
Map<String, List<String>> mapForYear = new TreeMap<String, List<String>>();
for(String date : array1)
{
    String year = date.substring(0,4);
    if(!mapForYear.containsKey(year))
        mapForYear.put(year, new ArrayList<String>());
    mapForYear.get(year).add(date);
}

答案 2 :(得分:0)

如果您使用java 8和Stream API,这很容易。我写了下面这段代码:

public List<String> getListByYear(String[] array, int year) {
    return Arrays.stream(array)
                 .filter(s -> s.contains(Integer.toString(year)))
                 .collect(Collectors.toList());
}

关于这个问题,有这样的解决方案:

for (String s : array) {
    int key = LocalDate.parse(s).getYear();
    List<String> value = map.get(key);
    map.put(key, value == null
             ? new ArrayList<String>() { { add(s); } }
             : new ArrayList<String>(value) { { add(s); } }
    );
}

与@Tunaki提供的结果相同,但不太漂亮。如果不支持Java 8,它将作为最紧凑的解决方案的替代方案。

输出在这里:

{
    2016 = [2016-06-06, 2016-01-06, 2016-05-06, 2016-04-06, 2016-02-06, 2016-06-06], 
    2017 = [2017-02-06, 2017-04-06, 2017-03-06],
    2015 = [2015-01-06, 2015-04-06, 2015-03-06, 2015-05-06, 2015-01-06]
}