2011-12-29 3 views
0

Могу ли я использовать любой другой подход, чтобы прочитать точку с запятой строки из текстового файла в Has карты вместо * sourceArra * уЧтения из .txt и хранения в Hashmap

public static void main(String[] args) throws IOException { 
    try { 
     ArrayList<Synset> booleansynsets = null; 
     ArrayList<Synset> booleanduplicatesynsets = null; 
     Map<String, String> basebooleanentitieslist = new HashMap<String, String>(); 
     BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\Users\\anand\\Desktop\\updatedDuplicateBooleanEntitiesList-sorted.txt")); 
     String line = ""; 
     while ((line = bufferedReader.readLine()) != null) { 
      String[] sourceArray = line.split(";"); 
      basebooleanentitieslist.put(sourceArray[0],sourceArray[1]); 
      System.out.println(line); 
     } 

// обновленные один

bufferedReader.toString(); 
     StringTokenizer st1 = new StringTokenizer(bufferedReader.toString(),";"); 
     while ((line = bufferedReader.readLine()) != null && st1.hasMoreTokens()) { 
    //    String[] sourceArray = line.split(";"); 

      basebooleanentitieslist.put(st1.nextToken(";"), st1.nextToken()); 
      System.out.println(line); 
     } 
+1

Что такое проблема с (текущим) этим подходом? – adatapost

+0

Ваш подход очень прост и прямолинейный, чрезмерная оптимизация только усложнит ситуацию. – medopal

+0

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

ответ

0

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

Вы не говорите, что вы пытаетесь оптимизировать для: производительности? использование памяти? читаемость?

Если вас беспокоит производительность, следующий вопрос заключается в том, действительно ли ваша озабоченность оправдана. Запустили ли вы свое приложение? Это слишком медленно? Профилировали ли вы его и определили, что разделение строк занимает значительное количество времени?

Что конкретно не так с использованием массива? (Да, я знаю, что выделение массива стоит что-то, но есть ли у вас какие-либо доказательства того, что это важно?)


Если вы пытаетесь оптимизировать для удобочитаемости, то я бы сказал, что использование String.split является вероятно, более читабельны для этого примера. (Многие программисты Java никогда не сталкивались/использовали класс StringTokenizer.)

Если вы пытаетесь оптимизировать использование производительности/памяти, то стоит попробовать StringTokenizer, но я бы не стал гарантировать это быстрее. Другой альтернативой является использование Pattern и Matcher непосредственно следующим образом:

Pattern pattern = Pattern.compile("([^;]*);(.*)"); 
    while ((line = bufferedReader.readLine()) != null) { 
     Matcher matcher = pattern.matcher(line) 
     if (matcher.matches()) { 
      basebooleanentitieslist.put(matcher.group(1), matcher.group(2)); 
     } 
    } 

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

+0

thanx stephen ... ваше объяснение о производительности - это kool .... у меня есть точка ...;) –

0

Рассмотрите возможность использования StringTokenizer класса.

+0

вы можете проверить измененный код с поста ... –

+0

Прошу продумать ваш новый код. Ваш исходный код был почти прав, вы читали строку, а затем разделили ее на токены. Когда вы используете StringTokenizer, вы должны проверить hasToken() перед использованием nextToken(), так как может быть некоторая ошибка в вашем входе, поскольку токена там отсутствует, и вы хотите изящно потерпеть неудачу. –

0

Вы можете использовать StringTokenizer (или) Split.