Двоичная матрица из массива пар

Из http://php.net/manual/en/function.date.php :

Чтобы форматировать даты на других языках, вы должны использовать setlocale () и strftime () вместо даты ().

-1
задан azro 13 July 2018 в 08:44
поделиться

2 ответа

  1. Используя 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}}
    
  2. Используя 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]]
    
0
ответ дан azro 17 August 2018 в 13:20
поделиться

Вот альтернативный подход, который использует группировку для имитации сводной таблицы:

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|
0
ответ дан ernest_k 17 August 2018 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: