Как отсортировать и упорядочить текстовый файл в Java для группировки строк - PullRequest
0 голосов
/ 08 марта 2012

Действительно изо всех сил пытается решить это ...

У меня есть текстовый файл с такими данными (17000 строк)

45226   1
45226   1
45226   1
45226   3
45226   5
23470   1
45226   5
45226   5
29610   4
37417   2
37417   3
37948   1

Я хочу отсортировать текстовый файл (используя java), чтобы все левые числа были сгруппированы, если правильное значение равно 1. или левое значение является группой, если правое не равно 1 (так что любое другое число). например (но не обязательно так)

3 x 45226   1
4 x 45226   MIXED
1 x 23470   1
1 x 29610   MIXED
2 x 37417   MIXED
1 x 37948   1

Я знаю, что мне может понадобиться использовать массив? или что-то вроде? но я просто не могу разобраться: '(

Любая помощь, код или предложения - с благодарностью!

Спасибо!

Ответы [ 5 ]

1 голос
/ 08 марта 2012

Я бы сгенерировал две карты, одну для правого 1 и одну для всех остальных правых значений.Каждая карта отображает левые значения для подсчета вхождений.Затем вы можете заполнить карты, просматривая данные.В псевдо-Java:

Map<Integer, Integer> onesMap = new HashMap<Integer, Integer>();
Map(Integer, Integer> otherMap = new HashMap<Integer, Integer>();

for (each left/right pair) {
    Map<Integer, Integer> map = right == 1 ? onesMap : otherMap;
    Integer count = map.get(left);
    map.put(left, count == null ? 1 : (1 + count));
}

В конце пары «ключ / значение» дают вам необходимое количество для каждого левого значения.

0 голосов
/ 08 марта 2012

Я бы посоветовал вам использовать два Multiset экземпляра из Гуава - один для "смешанных" значений и один для "1".Все, что вам нужно, это подсчет количества значений, в конце концов - и это именно то, что дает Multiset.

Так что вы бы использовали что-то вроде:

final Multiset<Integer> mixed = new HashMultiset<Integer>();
final Multiset<Integer> one = new HashMultiset<Integer>();

Files.readLines(new File(...), Charsets.UTF8,

    new LineProcessor<Void>() {
      @Override Void getResult() { return null; }

      @Override void processLine(String line) {
          // TODO: Split line into two integers
          int value = ...;
          int type = ...;

          Multiset<Integer> set = type == 1 ? one : mixed;
          set.add(value);
      }
    });

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

0 голосов
/ 08 марта 2012

Мой код:

public class Sort {


private static class Counter {

    private int one;
    private int mixed;

    public void incrementOne() {
        one++;
    }

    public void incrementMixed() {
        mixed++;
    }
}

public static void main(String[] args) throws IOException {
    Map<String, Counter> map = new LinkedHashMap<String, Counter>();
    String fileName = "input.txt";
    BufferedReader reader = new BufferedReader(new FileReader(fileName));

    for (String line = reader.readLine(); line != null; line = reader.readLine()) {
        StringTokenizer tokenizer = new StringTokenizer(line);
        String key = tokenizer.nextToken();
        String value = tokenizer.nextToken();
        Counter counter = map.get(key);
        if (counter == null) {
            counter = new Counter();
            map.put(key, counter);
        }
        if (value.equals("1")) {
            counter.incrementOne();
        } else {
            counter.incrementMixed();
        }
    }
    reader.close();
    BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
    for(Map.Entry<String, Counter>entry:map.entrySet()){
        Counter counter = entry.getValue();
        if(counter.one>0){
            writer.write(String.valueOf(counter.one));
            writer.write(" x ");
            writer.write(entry.getKey());
            writer.write("   1");
            writer.newLine();
        }
        if(counter.mixed>0){
            writer.write(String.valueOf(counter.mixed));
            writer.write(" x ");
            writer.write(entry.getKey());
            writer.write("   MIXED");
            writer.newLine();
        }
    }
    writer.close();

}

}

0 голосов
/ 08 марта 2012
Map<Integer, Integer> map1=new HashMap<Integer, Integer>();
Map<Integer, Integer> mapMixed=new HashMap<Integer, Integer>();

void addValues(int value, int num){
   if (num==1){
     if (map1.get(value)==null) map1.put(value,0);
     map1.put(value,map1.get(value)+1);
   } else {
     if (mapMixed.get(value)==null) mapMixed.put(value,0);
     mapMixed.put(value,mapMixed.get(value)+1);
   }
}

и после этого вы должны распечатать карты:

void printIt(){
   Set<Integer> keys=map1.keySet();
   keys.AddAll(mapMixed.keySet());
   for (int key:keys){
       if (map1.get(key)!=null) println(map1.get(key)+"x"+key+" 1");
       if (mapMixed.get(key)!=null) println(mapMixed.get(key)+"x"+key+" MIXED"); 
   }

}
0 голосов
/ 08 марта 2012

Я бы использовал карту для хранения данных:

Map<Integer, Set<Integer>> map = new TreeSet<Integer, Set<Integer>>();

Клавиша - это значение первой строки, и, поскольку оно не уникально, значение карты равнонабор, который содержит различные значения из второго столбца.

private void addLine(String line) {
  String[] fields = line.split("\\s*");
  Integer key = Integer.parseInt(fields[0]);
  Integer value = Integer.parseInt(fields[1]);
  Set<Integer> set = map.get(value);
  if (set == null) {
     set = new HashSet<Integer>();
     map.put(key, set);
  }
  set.add(value);
}

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

private String getResult(Integer key) {
  Set<Integer> values = map.get(key);
  if (values == null) {
     return null;  // key not in map (unknown number)
  } else if (values.size() == 1) {
     return values.iterator().next().toString();
  } else {
    return "MIXED";
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...