2013-11-11 6 views
1

Я пытаюсь создать простой словарь, который сравнивает строку со словом на ArrayList и затем возвращает другое значение из списка. ArrayList выложено с иностранным словом, а затем английский эквивалент, поэтому идея заключается в том, что я печатаю слово, используя сканер, чтобы сравнить его с массивом, а затем вернуть значение индекса +1, так что если слово I типа 7-е место в списке, я хочу, чтобы он вернул восьмое слово и распечатал его.Сравнение и извлечение элементов из ArrayList

Я получил основную идею ввода строки и сравнения, но я не знаю, как вернуть следующее слово из ArrayList:

public void translateWords(){ 
     String nameSearch; 
     nameSearch=input.nextLine(); 

     for (Phrase c:phrases) { 
      if (c.getName().equals(nameSearch)) { 
       System.out.println(c.advancedToString());  
       return; 
      } 
     } 
     System.out.println("not on list"); 

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

+0

Если вы хотите создать словарь, почему бы не использовать [словарь] (http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html)? –

+0

Вы можете сделать цикл по-старому (т. Е. Используя целочисленный счетчик), а затем вызывать фраз.get (i + 1) – orique

ответ

0

for-each не подходит в данном случае, потому что вы не можете получить доступ последовательных элементов, в вашем случае переведенных слов. Поэтому я предлагаю вам использовать Iterate

Я полагаю phrases имеет тип List<Phrase>

public void translateWords(){ 
     String nameSearch; 
     nameSearch=input.nextLine(); 

     Iterator<Phrase> it = phrases.iterator(); 
     while(it.hasNext()) 
     { 
      Phrase c = it.next(); 
      if (c.getName().equals(nameSearch)) { 
       System.out.println(it.next().advancedToString());  
       return; 
      } 
     } 

     System.out.println("not on list"); 
} 
+0

Благодарим вас, этот работает с удовольствием. Он делает именно то, что я хочу. – user2978821

0

Будет ли что-то подобное делать для вас? Не тестировался, просто из моей головы:

public void translateWords(){ 
    String nameSearch; 
    nameSearch=input.nextLine(); 

    if(c.indexof(nameSearch)){ 
     System.out.println(c.get(c.indexof(c.indexof(nameSearch)+1)); 
    } else { 
     System.out.println("not on list"); 
    } 
} 
+0

'indexOf' не будет работать таким образом, так как это список фраз, а не строк. –

+0

Кроме того, код довольно неправильный ... Строка 'c.get (c.indexof (c.indexof (nameSearch) +1)' будет пытаться получить индекс ... индекса? Кроме того, в скобках нет match. Отбрасываем второй 'indexOf ('. Тем не менее 'indexOf' вызывается без необходимости часто и не будет работать в первую очередь (см. предыдущий комментарий). –

+0

Наконец, вероятно, это должно быть' if (c.indexOf (nameSearch)! = -1) '... –

0

Другим способом было бы использовать словарь, например, Java HashMap. Не зная, как реализуется ваш Phrase класс, это может выглядеть следующим образом:

// create dictionary 
Map<Phrase, Phrase> d = new HashMap<Phrase, Phrase>(); 
// add phrases 
d.put(new Phrase("Guten Tag", "de"), new Phrase("Good morning", "en")); 
// get translation 
Phrase p = d.get(new Phrase(nameSearch, "de")); 

(Чтобы сделать эту работу, Phrase.equals и Phrase.hashCode должны быть implemented.)

Это, кажется, лучший выбор данных структуры для вашей задачи. Используя HashMap, время поиска для элементов: O (1), в отличие от O (n) в вашем подходе, что может иметь значение, если ваш словарь содержит тысячи или миллионы фраз, или если вам нужно это сделать очень часто. Возможным недостатком является то, что записи должны быть действительно равными, например. вы не могли (легко) проверить «похожие» фразы или слова.

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