Как преобразовать список в карту, используя список в качестве ключа в Java - PullRequest
1 голос
/ 12 мая 2019

Я читаю таблицу Excel, содержащую четыре столбца, и создаю список. Теперь я хотел бы использовать первые три столбца в качестве ключа и использовать последний столбец в качестве значения. Я видел похожие вопросы, которые задавали, но во всех этих вопросах в качестве ключа используется либо строка, либо целое число.

public class initial {
private int from;
private int to;
private int via;
private int cost;
//constructor
//set and get methods
//hashCode and equals methods
}

public class myTuple {
private int from;
private int to;
private int via;
}

 //main function
 //get the Excel Table as a list
ArrayList<initial> myList = new ArrayList<initial>();

for(int i= mySheet.getFirstRowNum()+1 ; i<= mySheet.getLastRowNum(); i++) {
   initial e = new initial();
   Row ro = mySheet.getRow(i);
   for(int j = ro.getFirstCellNum(); j <= ro.getLastCellNum();  j++) {
    Cell ce = ro.getCell(j);
    switch(j) {
    case 0:
      e.setFrom((int) ce.getNumericCellValue());
          break;
              .....

    case 3:
      e.setCost((int) ce.getNumericCellValue());
      break;    
    }
}
myList.add(e);
}

//Create map
Map<myTuple, Integer> myMap = new HashMap<>();

Я не знаю, как действовать после этого. Я считаю, что я должен использовать что-то вроде;

Map<myTuple, Integer> myMap= myList.stream().collectC(ollectors.toMap(myList:: , myList::));

Если бы кто-то мог мне помочь, я бы очень признателен.

Кроме того, если вы считаете, что есть более эффективный способ сделать это (например, способ, которым я читаю свои данные и анализирую в список, способ, которым я преобразую список в карту), пожалуйста, дайте мне знать. Несмотря на то, что это не входит в содержание этого вопроса, если есть лучший способ прочитать многомерную таблицу и проанализировать список, как я, я бы тоже хотел это услышать. В будущем у меня будут большие таблицы с большим количеством столбцов. Следовательно, я не совсем уверен, что путь через каждый столбец с оператором switch - это путь.

Ответы [ 3 ]

2 голосов
/ 12 мая 2019

Вы можете просто создать карту во время цикла.

Tuple key = new Tuple(row.getNum(0), row.getNum(1), row.getNum(2));
List<Integer> value = new ArrayList<>();
for (int cell = 3; cell < row.getCount(); cell++) {
    value.add(row.getNum(cell));
}
Map.put(key,value);
1 голос
/ 12 мая 2019

Для сборщика toMap требуется 2 функции (1 для создания ключа и 1 для создания значения).Вы можете использовать лямбда-выражения (для извлечения соответствующих полей из вашего исходного типа):

Map<MyTuple, Integer> myMap = myList
    .stream()
    .collect(Collectors.toMap(
        i -> new myTuple(i.from, i.to, i.via),
        i -> i.cost
));

Для вашего целевого типа "MyTuple" требуется конструктор, равно и хэш-код.

0 голосов
/ 12 мая 2019

Вот пример:

class Tuple implements Comparable<Tuple> {
        Object one;
        Object two;
        Object three;
        public Tuple(final Object one, final Object two, final Object three) {
            this.one = one;
            this.two = two;
            this.three = three;
        }
        @Override
        public int compareTo(final Tuple that) {
            // TODO: Do your comparison here for the fields one, two and three
            return 0;
        }
    }
    Map<Tuple, Object> mapKeyedByCompositeTuple = new HashMap<>();
    // TODO: Inside your loop
    for (int i = 10; i > 0; i--) {
        Tuple key = new Tuple("cell-one-value-" + i, "cell-two-value-" + i, "cell-three-value-" + i);
        mapKeyedByCompositeTuple.put(key, "cell-four-value-" + i);
    }
    System.out.println(mapKeyedByCompositeTuple);

Надеюсь, что помогает, ура, Майкл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...