Разбор случайные фразы из файла


Это, по сути, читает специально структурированный файл со сканера, а затем анализирует случайные фразы и печатает их:

{
<start>
<greeting> <object>
}

{
<greeting>
hello
bonjour
aloha
}

{
<object>
world
universe
multiverse
}

Возможных случайных фраз могут быть: "Здравствуй, мир", "вселенная Бонжур" и т. д...

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

Это не считается изменой, пока я занимаюсь большую часть программирования, поэтому, пожалуйста, просто мне точку в правильном направлении и внести предложения.

package comprehensive;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;

/**
 * Generates random phrases by reading the specified grammar file 
 * and outputting the number of phrases specified by the user.
 * @author Jun Tang and John Newsome
 *
 */
public class RandomPhraseGenerator {

    public static HashMap<String,ArrayList<String>> map;

    public static void main(String[] args) throws FileNotFoundException{
        Scanner k = new Scanner(new File(args[0]));
        int numPhrases = Integer.parseInt(args[1]);
        addKeys(k);
        while(numPhrases > 0){
            parseStrings();
            numPhrases--;
        }
    }

    /**
     * Assimilates all of the keys and their associated values into map (a public static hashmap).
     * @param scan The scanner that is reading from the specified file.
     */
    public static void addKeys(Scanner scan){
        map = new HashMap<String, ArrayList<String>>();
        while(scan.hasNextLine()){
            if(scan.nextLine().equals("{")){
                String key = scan.nextLine();
                map.put(key, new ArrayList<String>());
                String next = scan.nextLine();
                while(!next.equals("}")){
                    map.get(key).add(next);
                    next = scan.nextLine();
                }
            }
        }
    }

    /**
     * Parses random String phrases from map and prints them. 
     * Must already have assimilated keys and values prior by using the addKeys() method. 
     */
    public static void parseStrings(){
        Random random = new Random();
        StringBuilder strBuf = new StringBuilder((map.get("<start>").get(0)));
        int firstInstance  = strBuf.indexOf("<", 0);
        int secondInstance = strBuf.indexOf(">", firstInstance);
        while(firstInstance >= 0 && secondInstance >= 0){
            String nonTerminal = strBuf.substring(firstInstance, secondInstance+1);
            strBuf.replace(firstInstance, secondInstance+1, (map.get(nonTerminal).get(random.nextInt(map.get(nonTerminal).size()))));
            firstInstance  = strBuf.indexOf("<", firstInstance);
            secondInstance = strBuf.indexOf(">", firstInstance);
        }
        System.out.println(strBuf);
    }
}


Комментарии
1 ответ

Я не эксперт в оптимизации производительности или даже нитки, так что мой комментарий код будет в основном быть некоторые рекомендации по стилю, но у меня есть предложения, как я бы реализовать здание фраза, чтобы быть быстрее - чисто из интуиции :-)


  • Придираться в начале: вы должны попробовать и очистить ваш вмятины. Они повсюду и делает чтение кода немного сложнее

  • Вы должны объявить переменные для использования интерфейсов, где это уместно, а не конкретный класс. Что делает код более гибким, например, в случае, если вы получите ключи от другого источника. В вашем случае декларировать карту как карту>.

  • Избегать глобальных переменных. Если бы лучше addKeys вернуть карту (и, следовательно, будет переименован readKeys) и передать его parseString в качестве аргумента.

  • В основные функции для петли является, вероятно, более целесообразно вместо пока.

  • Пытаются избавиться от повторяющихся сканирования.строки(); в внутреннее время цикла, путем перемещения существующего состояния внутри цикла.

Теперь для оптимизации строительных фразы. Есть два основных момента, я хотел бы рассмотреть здесь:


  • Избежать копирования данных. В настоящее время вам преобразовать вашу строку с заполнителями в StringBuilder и вставить текст на месте плейсхолдера. Как создать StringBuilder и вкладывание в них требуется выделить копировать данные внутри.

  • Не повторите анализ текста заполнителя. Вместо этого я бы еще анализ текста в структуре данных, а затем генерировать случайные фразы, используя эту структуру.

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

5
ответ дан 27 апреля 2011 в 08:04 Источник Поделиться