2013-09-23 3 views
0

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

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

public class Part1 { 




public static void doIt(BufferedReader r, PrintWriter w) throws IOException { 
    Set<String> s = new HashSet<String>(); 
    String inpt; 
    int n = 0; 
    while ((inpt = r.readLine()) != null) { 
     s.add(inpt); 
     n++; 
    } 
    Iterator<String> i = s.iterator(); 
    while (i.hasNext()) { 
     w.println(i.next()); 
    } 

} 


public static void main(String[] args) { 
    try { 
     BufferedReader r; 
     PrintWriter w; 
     if (args.length == 0) { 
      r = new BufferedReader(new InputStreamReader(System.in)); 
      w = new PrintWriter(System.out); 
     } else if (args.length == 1) { 
      r = new BufferedReader(new FileReader(args[0])); 
      w = new PrintWriter(System.out);     
     } else { 
      r = new BufferedReader(new FileReader(args[0])); 
      w = new PrintWriter(new FileWriter(args[1])); 
     } 
     long start = System.nanoTime(); 
     doIt(r, w); 
     w.flush(); 
     long stop = System.nanoTime(); 
     System.out.println("Execution time: " + 10e-9 * (stop-start)); 
    } catch (IOException e) { 
     System.err.println(e); 
     System.exit(-1); 
    } 
} 
} 

} 
+2

Что вы имеете в виду, когда говорите «это не работает должным образом». Что на самом деле происходит не так? –

+1

Одним из наиболее важных шагов в решении проблемы является определение того, как представлять информацию, которую ваша программа должна отслеживать. В частности, какие структуры данных (обычно объекты) вы хотите использовать для этого. Ваше использование HashSet позволит вам отслеживать каждую строку, которую читает ваша программа, и проверять наличие дубликатов. Однако это не дает вам способ «запомнить», сколько раз вы видели эту строку. Кроме того, набор не представляет собой определенный «порядок» элементов, которые он хранит. – user1445967

+0

Вы можете сохранить свои строки в качестве ключей и числа появления любой строки (частоты) в качестве значения для этой конкретной клавиши. –

ответ

0

Ваше проектное решение, чтобы использовать Набор хорош, но это не поможет вам count вхождения. Вам нужна карта s. К счастью, ключи Карты - это Set.

без ложки кормления вам ответ:

  • Используйте Map<String, Integer> для хранения слов и их появление всего
  • Выбрали LinkedHashMap в качестве реализации карт для сохранения порядка
  • Использовать обычные Map.contains(), чтобы определить, если вам нужно для создания новой записи
  • Использовать автобоксинг/распаковку для арифметики
  • При выводе, итерации по t он Map.entrySet() с помощью цикла Еогеасп для Map.Entry<String, Integer> объектов

Вы должны быть в состоянии сделать все это всего лишь несколько строк кода.

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