поиск пары ключ-значение в списке хеш-карт - PullRequest
0 голосов
/ 28 апреля 2011

Я читаю два CSV-файла, содержащие набор атрибутов

File 1 attributes = name, class, rollno,   
File 2 attributes = rollno, city,town

Мне нужно сопоставить два файла, и для каждого подходящего ролла мне нужно добавить атрибуты File 2 в File1 и создать CSV-файлв формате rollno, name, class, city, town

До сих пор мне удалось прочитать значения File1 и file2 в Список связанных хэш-карт этого типа.

List<Map<Object, Object>> _students = new ArrayList<Map<Object, Object>>();

Я не могу выяснить шаги для продвижения вперед.

Как мне выполнить поиск по карте списка в первом файле, если нет броска, содержащегося во второй карте списка, и добавитьэто к firstlistmap?

, а затем распечатать его в CSV-файл в указанном порядке (я могу перебрать и распечатать все значения в том порядке, в котором они были вставлены в карту)

Ответы [ 4 ]

1 голос
/ 28 апреля 2011

Я бы подошел к этой проблеме, прочитав первый файл и сохранив значения в хэш-карте.и затем добавьте к этому hashmap. Ключом будет номер роли, а значением будет список других значений.

Map<String, List<String>> map = new HashMap<String, List<String>>()

Pseudocode:

for (List<String> line : file1.lines) {
 List curLine = new LinkedList();
 curLine.add(line.get(0));
 curLine.add(line.get(1));

 map.put(line.get(2),curLine)
}

for (List<String> line : file2.lines) {
 String key = line.get(0);
 String list = map.get(key);
 if (list != null)
 {
  list.add(line.get(1));
  list.add(line.get(2));
 }

 map.put(key,list); // probably not necessary as you change the reference that is already in the map, but I'm not sure

}
0 голосов
/ 28 апреля 2011

Попробуйте этот полный код, он будет работать

import java.util.HashMap;
import java.util.Map;

import com.csvreader.CsvReader;

public class ListMap {
    public static void main(String args[]) throws Exception {
        Map<String, ListMap> map = new HashMap<String, ListMap>();
        CsvReader reader = null;
        reader = new CsvReader("c:/list1.csv");
        reader.readHeaders();
        while (reader.readRecord()) {
            map.put(reader.get("RollNo"), new ListMap(reader.get("RollNo"),
                    reader.get("Name"), reader.get("Class"),
                    reader.get("City"), reader.get("Town")));
        }
        reader = new CsvReader("c:/list2.csv");
        reader.readHeaders();
        while (reader.readRecord()) {
            ListMap obj = map.get(reader.get("RollNo"));
            if (obj != null) {
                obj.setCity(reader.get("City"));
                obj.setTown(reader.get("Town"));
            } else {
                obj = new ListMap(reader.get("RollNo"), reader.get("Name"),
                        reader.get("Class"), reader.get("City"), reader
                                .get("Town"));
            }
            map.put(reader.get("RollNo"), obj);
        }
        for (Map.Entry<String, ListMap> entry : map.entrySet()) {
            ListMap obj = entry.getValue();
            System.out.println(entry.getKey() + " " + obj.name + " "
                    + obj.className + " " + obj.city + " " + obj.town);
        }

    }

    private String roolNo, name, className, city, town;

    public ListMap(String roolNo, String name, String className, String city,
            String town) {
        super();
        this.roolNo = roolNo;
        this.name = name;
        this.className = className;
        this.city = city;
        this.town = town;
    }

    public String getRoolNo() {
        return roolNo;
    }

    public void setRoolNo(String roolNo) {
        this.roolNo = roolNo;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getTown() {
        return town;
    }

    public void setTown(String town) {
        this.town = town;
    }

}
0 голосов
/ 28 апреля 2011

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

List<String[]> file1 = loadFile1();   // each item is a String array {name, class, rollNo}
List<String[]> file2 = loadFile2();   // each item is a String array {rollNo, city, town}

затем создайте карту следующим образом:

// sorted map
Map<String, String[]> result = new TreeMap<String, String[]>();

// create a map entry for each roll nr of first file, add name and class
for (String[] file1Item : file1) {
  result.put(file1Item[0], new String[4] {file1Item[1], file2Item[2], "", ""});
}

// add the values from list 2 
for (String[] file2Item : file2) {
  String[] value = result.get(file2Item[2]);
  if (value != null) {
     value[2] = file2Item[1];
     value[3] = file2Item[2];
  }
}

Теперь у вас есть такая карта:

rollno -> [name, class, city, town]
0 голосов
/ 28 апреля 2011

Загрузите второй файл в карту с ключом rollno Таким образом, вы можете искать детали, которые совпадают с роллно, используя метод get().

...