我想将单个数组过滤成部分。假设我有一个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""]
阵列基于多年。我不知道完成这项任务的正确方法。
答案 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]
}