Хранить индексы в массиве - PullRequest
0 голосов
/ 05 апреля 2011

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

while (index > 0) {

            for (int i = 0; i < data.length; i++) {

                data[i] = index;

            }

            System.out.println("Index : " + index);


            index = input.indexOf(word, index + word.length());

        }

Ответы [ 3 ]

0 голосов
/ 05 апреля 2011

Если вы пытаетесь создать список индексов слова в строке, попробуйте использовать перегрузку indexOf(String str, int fromIndex) (из API Java ).

РЕДАКТИРОВАТЬ: Также проверьте этот вопрос: Переполнение стека: Java Подсчет # вхождений слова в строку

0 голосов
/ 07 апреля 2011

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

Класс ниже показывает, как я реализовал Карту, хранящую списки.



import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * Class of a map which allows to have a list of items under a single key. 
 * @author Konrad Borowiecki
 *
 * @param <T1> type of the key.
 * @param <T2> type of objects the value list will store.
 */
public class ListHashMap<T1, T2> extends HashMap<T1, List<T2>>
{
    private static final long serialVersionUID = -3157711948165169766L;

    public ListHashMap()
    {
    }

    public void addItem(T1 key, T2 item)
    {
        if(containsKey(key))
        {
            List<T2> tml = get(key);
            tml.add(item);
        }
        else
        {
            List<T2> items = new ArrayList<T2>();
            items.add(item);
            put(key, items);
        }
    }

    public void removeItem(T1 key, T2 item)
    {
        List<T2> items = get(key);
        items.remove(item);
    }

    public void removeItem(T2 item)
    {
        Set<java.util.Map.Entry<T1, List<T2>>> set = entrySet();
        Iterator<java.util.Map.Entry<T1, List<T2>>> it = set.iterator();

        while(it.hasNext())
        {
            java.util.Map.Entry<T1, List<T2>> me = it.next();
            if(me.getValue().contains(item))
            {
                me.getValue().remove(item);
                if(me.getValue().isEmpty())
                    it.remove();
                break;
            }
        }
    }
}

В вашем случае у вас будет отображение слов в список индексов, поэтому вы бы назвали класс следующим образом: ListHashMap wordToIndexesMap = new ListHashMap ();

Наслаждайся, Боро.

0 голосов
/ 05 апреля 2011

Я прокомментировал ваш код ниже. Пожалуйста, прочитайте комментарии для понимания.

while (index > 0) { //String.indexOf can return a 0 as a valid answer. Use -1.
//Looping over something... Why don't you show us the primer code?
    for (int i = 0; i < data.length; i++) {
        /*
        Looping over the `data` array.
        You're filling every value of `data` with whatever is in `index`. Every time.
        This is not what you want.
        */      
        data[i] = index; 
    }

    System.out.println("Index : " + index);
    //OK
    index = input.indexOf(word, index + word.length());
}

Замените ваш массив данных и связанный цикл с ArrayList. Используйте ArrayList.add() для каждого найденного вами индекса.

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