2014-11-11 3 views
0

В текстовом файле данные распространяются, как показано ниже, я рассматриваю это как таблицу для удобства.Ценности Кластеризация

Column1 Column2 Column3 Column4 
    A   B  1  2 
    A   B  1  5 
    A   C  1  3 
    B   C  2  3 
    C   A  3  4 
    A   B  4  5 

Мне нужно сгруппировать то же значение, если column1 и column2 таким же, как A->B повторяется 3 раза, как это совместить.

A   B  1  2 
A   B  1  5 
A   B  4  5 
+0

Где вы храните свою 'column3'? –

+0

Прохладный, но, у вас есть вопрос? –

+0

@JBNizet вопрос, как сгруппировать эти подобные. – Kamsa

ответ

1

Вот как я это сделаю.

  1. Определение класса Record, содержащий 4 полей
  2. Определения класса RecordKey, содержащий идентификацию строки, то есть два первых значения столбцов. Убедитесь, что значения equals и hashCode определены правильно.
  3. Создать Map<RecordKey, List<Record>>.
  4. Прочитайте записи по строкам. Если на карте уже есть список для текущего ключа записи, добавьте текущую запись в этот список. В противном случае создайте новый список, добавьте к нему запись и поместите этот список на карту.
0

Предоставление памяти не является проблемой, а просто загружать их в List, а затем сортировать их с этими двумя столбцами в качестве составного ключа, что приведет к их кластеру. Я хотел бы предложить создать простой класс для хранения каждой записи, а затем с помощью list.sort(new Comparator<MyRecord>(){...});

Сравнения метода будет довольно просто, если вы можете быть уверены, что у вас нет null с в ваших ключах:

 @Override 
     public int compare(MyRecord a, MyRecord b) { 
      int n = a.getFirst().compareTo(b.getFirst()); 
      if (n == 0) 
       return a.getSecond().compareTo(b.getSecond()); 
      return n; 
     } 

Если вы можете имеют нули, тогда вам нужно быть немного осторожнее и проверить их

0

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

Map<String, Map<String, List<Record>>> parentMap 

Запись - это pojo, в которой вы можете хранить всю запись.

public class Record { 
    private String column1; 
    private String column2; 
    private Integer column3; 
    private Integer column4; 

    //getter setter 
} 

И на карте вы можете разместить это.

Map<String, Map<String, List<Record>>> parentMap = new HashMap<String, Map<String,List<Record>>>(); 
Map<String, List<Record>> innerMap; 
List<Record> innerList; 
Record r; 
for (Record loop) { 
    innerMap = parentMap.get(column1); 

    if (innerMap == null || innerMap.size() == 0) { 
     innerMap = new HashMap<String, List<Record>>(); 
     parentMap.put(column1, innerMap); 
    } 
    innerList = innerMap.get(column2); 
    if (innerList == null || innerList.size() == 0) { 
     innerList = new ArrayList<Record>(); 
     innerMap.put(column2, innerList); 
    } 
    r = new Record(); 
    //set values in r 

    innerList.add(r); 
} 
+0

Запись - это «poja», что это значит? – Kamsa

+0

Извините, его орфографическая ошибка. Это pojo (обычный объект Java) –

Смежные вопросы