Возвращает строки в массиве, которые начинаются с переданного начального - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть файл .txt, который содержит данные для состояний, как указано ниже:

AL,Alab,4860
AK,Alas,7415
AZ,Ariz,6908
AR,Arka,2988    

Я создал функцию, которая подсчитывает, сколько существует состояний, которые начинаются с переданного начального значения:

public int CInitial(char initial) {
        int total = 0;
        for(int i = 0; i < states.length; i++) { //states is an array which includes all states present in the .txt file
        String testString = states[i].getName(); // getName gets the name of the states present in the .txt file
        char[] stringToCharArray = testString.toCharArray();
        for (char output : stringToCharArray) {
            if(initial == output) {
                total++;        
            }

        }   

    }
        return total; 
}

Это вернет число 4, если передано «A», и 0, если передан любой другой инициал, поскольку есть 4 состояния, которые начинаются с буквы «A».

Теперь, как я могу создать новую функцию, которая передает символ и возвращает имя всех состояний, которые начинаются с этого символа? Для Instance это начальный тип возвращаемого значения, необходимый для этого, однако у меня возникают проблемы с запуском этого. Идентичен ли процесс созданной мной функции countStatesCountByInitial ?

public State[] CByInitial(char initial) {
        return new State[] {}; //to be completed    
    }   

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Да, это будет очень похоже на countStatesCountByInitial. Основное отличие заключается в том, что каждый раз, когда вы находите совпадение, вы хотите добавить состояние в массив. Поскольку мы заранее не знаем размер массива, мы можем вместо этого использовать List.

public State[] getStatesCountByInitial(char initial) {
    ArrayList<State> found = new ArrayList<>();

    // this is the same as before
    for(int i = 0; i < states.length; i++) {
        String testString = states[i].getName();
        char[] stringToCharArray = testString.toCharArray();
        for (char output : stringToCharArray) {
            if(initial == output) {
            // except here when you find a match, you add it into the list
            found.add(states[i]);        
            }
        }   
    }

    // return as array
    return found.toArray(new State[found.size()]);
}

Как предложил Патрик, мы можем избежать использования List, используя countStatesCountByInitial для инициализации размера состояний.

public State[] getStatesCountByInitial(char initial) {
    int matchSize = countStatesCountByInitial(initial);
    States[] found = new States[matchSize];
    int foundIndex = 0;

    // this is the same as before
    for(int i = 0; i < states.length; i++) {
        String testString = states[i].getName();
        char[] stringToCharArray = testString.toCharArray();
        for (char output : stringToCharArray) {
            if(initial == output) {
                // except here when you find a match, you add it into the array
                found[foundIndex] = states[i];
                foundIndex++;
            }
        }   
    }

    // return the array
    return found;
} 
0 голосов
/ 02 сентября 2018

Вы можете выполнить обе операции просто одним способом.

public static ArrayList<State> getStatesCountByInitial(char initial) {
        ArrayList selectedStates = new ArrayList<State>();
        for(int i = 0; i < states.length; i++) {
            if(states.charAt(0) == initial){
                selectedStates.add(states[i]);
            }
        }
        return selectedStates;
}

Этот метод вернет массив. Если вы хотите получить количество, вызовите этот метод и получите размер массива.

ArrayList<State> statesNew = getStatesCountByInitial('A');
int count = statesNew.size();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...