Из http://php.net/manual/en/function.date.php :
Чтобы форматировать даты на других языках, вы должны использовать setlocale () и strftime () вместо даты ().
Map<String, Map<String,Integer>>
, с первой карты вы выберете tha argument
, а на втором вы выберете value
и получите 0
или 1
ArrayList<Pair<String, String>> list = new ArrayList<>();
list.add(new Pair<>("ag1", "val1")); list.add(new Pair<>("ag1", "val2"));
list.add(new Pair<>("ag1", "val4")); list.add(new Pair<>("ag2", "val2"));
list.add(new Pair<>("ag2", "val4")); list.add(new Pair<>("ag3", "val2"));
list.add(new Pair<>("ag3", "val2")); list.add(new Pair<>("ag3", "val3"));
List<String> arguments = list.stream().map(Pair::getKey).distinct().collect(Collectors.toList());
List<String> values = list.stream().map(Pair::getValue).distinct().collect(Collectors.toList());
Map<String, Map<String,Integer>> map = new TreeMap<>();
for(String ag : arguments){
map.putIfAbsent(ag, new TreeMap<>());
for(String val : values){
if(list.contains(new Pair<>(ag,val))){
map.get(ag).put(val, 1);
}else{
map.get(ag).put(val,0);
}
}
}
System.out.println(map);
//{ag1={val1=1, val2=1, val3=0, val4=1},
ag2={val1=0, val2=1, val3=0, val4=1},
ag3={val1=0, val2=1, val3=1, val4=0}}
short[][]
, в режиме stream
просто добавьте операцию sorted()
, чтобы сохранить порядок. Он будет перебирать разные arguments
и values
, и если в исходном списке будет соответствующий Pair
, он установит хороший индекс на 1
, если не 0
ArrayList<Pair<String, String>> list = new ArrayList<>();
list.add(new Pair<>("ag1", "val1")); list.add(new Pair<>("ag1", "val2"));
list.add(new Pair<>("ag1", "val4")); list.add(new Pair<>("ag2", "val2"));
list.add(new Pair<>("ag2", "val4")); list.add(new Pair<>("ag3", "val2"));
list.add(new Pair<>("ag3", "val2")); list.add(new Pair<>("ag3", "val3"));
List<String> arguments = list.stream().map(Pair::getKey).distinct().sorted().collect(Collectors.toList());
List<String> values = list.stream().map(Pair::getValue).distinct().sorted().collect(Collectors.toList());
short[][] res = new short[arguments.size()][values.size()];
for(int ag = 0 ; ag<arguments.size() ; ag++){
for(int val = 0 ; val<values.size() ; val++){
if(list.contains(new Pair<>(arguments.get(ag),values.get(val)))){
res[ag][val] = 1;
}else{
res[ag][val] = 0;
}
}
}
System.out.println(Arrays.deepToString(res));
// [[1, 1, 0, 1], [0, 1, 0, 1], [0, 1, 1, 0]]
Вот альтернативный подход, который использует группировку для имитации сводной таблицы:
List<String> rights = inputArray.stream()
.map(Pair::getRight)
.distinct()
.sorted()
.collect(Collectors.toList());
List<Pair<String, Map<String, Boolean>>> mapping = inputArray.stream()
.collect(Collectors.groupingBy(Pair::getLeft,
Collectors.mapping(Pair::getRight, Collectors.toSet())))
.entrySet().stream()
.map(entry -> {
Map<String, Boolean> values = new HashMap<>();
rights.stream().forEach(v -> {
values.put(v, entry.getValue().contains(v) ? Boolean.TRUE : Boolean.FALSE);
});
return Pair.of(entry.getKey(), values);
}).collect(Collectors.toList());
И печать этой карты приводит к следующему:
rights.forEach(r -> System.out.print(r + " | "));
System.out.println();
mapping.forEach((key) -> {
StringBuilder sb = new StringBuilder(key.getLeft() + " | ");
rights.forEach(rr -> sb.append((key.getRight().get(rr) ? " 1" : " 0") + "|"));
System.out.println(sb);
});
Результат:
value1 | value2| value3| value4|
argument1 | 1| 1| 0| 1|
argument2 | 0| 1| 0| 1|
argument3 | 1| 1| 1| 0|