2013-09-18 2 views
0

У меня есть метод, который читает txt-файл, и мне нужно его взять каждое слово в текстовом файле, а затем повторить их в отсортированном порядке, не удаляя дубликаты. Мне удалось заставить его работать, но хотелось бы, чтобы код был более эффективным. Может кто-нибудь дать мне hinter, что я могу сделать, чтобы сделать это быстрее? Что-то другое, чем ArrayList? Есть ли другой способ сортировки, кроме Collections.sort?Как сделать мой отсортированный список более эффективным?

public static void doIt(BufferedReader r, PrintWriter w) throws IOException { 
    ArrayList<String> p = new ArrayList<String>(); 
    String line; 
    int n = 0; 
    while ((line = r.readLine()) != null) { 
     p.add(line); 
     n++;       
    }  

    Collections.sort(p); 
+1

Нужно ли отслеживать 'n'? – nhahtdh

+2

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

+0

Вы можете попробовать 'PriorityQueue' http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html, который представляет собой реализацию Java кучи. Не могу сказать, будет ли он более эффективным, так как он имеет такую ​​же большую сложность O, как и сортировку. – cyon

ответ

3

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

TreeMap<String, Integer> words = new TreeMap<>(); 

while ((line = r.readLine()) != null) { 
    for (String word : line.split("\\s+")) { 
     if (words.containsKey(line)) 
      words.put(line, words.get(line) + 1); 
     else 
      words.put(line, 1); 
    }     
} 

Это трудно, если не невозможно сказать, какой вариант будет более эффективным, не зная деталей файла вы будете читать, и в конечном счете синхронизации оба варианта.

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

+1

+1 это было бы лучше, хотя и не обязательно быть быстрее. –

+1

Вы протестировали, если эта опция повышает производительность или просто идею? –

+1

OP говорит, что он не хочет удалять дубликаты. 'TreeMap' не допускает дубликатов. –

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