Как вернуть только необходимые значения без нулей и нулей в этом вопросе? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть вопрос, который я уже давно решаю.

«Метод должен возвращать массив, содержащий элементы, которые делятся на определенное число», в данном случае цель - 5.

Вот мое решение

public static int[] Divisible(int[] array, int target){
    int[] answer = new int[array.length];

    for (int i = 0; i<array.length; i++){
       if (array[i] % target == 0){
           answer[i] = array[i];
       }
    }
    return answer;
}

при условии, что мой ввод int [] input = {5,3,6,10};мой вывод будет [5,0,0,10].

Мой желаемый вывод должен быть [5,10].

пожалуйста, как мне избавиться от нулей

Ответы [ 7 ]

0 голосов
/ 27 февраля 2019

Вместо того, чтобы использовать примитив int, я согласился использовать вместо него Integer.Вот мое решение.

public static Integer[] divisible(Integer[] array, int target) {

    int j = 0;
    ArrayList<Integer> list = new ArrayList<Integer>();

    for (int i = 0; i < array.length; i++) {
        if (array[i] % target == 0) {
            j++;
            list.add(array[i]);
        }
    }

    Integer answer[] = new Integer[j];
    answer = list.toArray(answer);

    return answer;
}
0 голосов
/ 27 февраля 2019

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

Примерно так:

int[] result=new int[array.length];
int resultindex=0; //create a separate counter
for(int i=0;i<array.length;i++)
{
    if(array[i]%target==0)
    {
        result[resultindex]=array[i];
        ++resultindex; //update the counter
    }
}
0 голосов
/ 27 февраля 2019

Я использовал метод, указанный @GhostCat, но он заставил меня полностью изменить код.Это мой новый код

public static Object[] Divisi(int[] array, int target){
    ArrayList<Integer> answer = new ArrayList<>();

    for (int i = 0; i<array.length; i++){
        if (array[i] % target == 0){
            answer.add(array[i]);
        }
    }

    return answer.toArray();
}

Это дало мне желаемый ответ, но как еще я могу сделать это без преобразования в объект

0 голосов
/ 27 февраля 2019

вы можете сделать так

public static int[] Divisible(int[] array, int target){
    List<Integer> list = new ArrayList<>();
    for (int i = 0; i<array.length; i++){
        if (array[i] % target == 0){
            list.add(array[i]);
        }
    }
    int[] ints = new int[list.size()];
    for (int i = 0; i < ints.length; i++) {
        ints[i] = list.get(i);
    }
    return ints;
}
0 голосов
/ 27 февраля 2019

Самый короткий и самый быстрый способ сделать это - вы можете изменить массив на ArrayList и затем использовать метод .toArray (), чтобы вернуть его в качестве примитивного массива при возврате.

public static Integer[] Divisible(int[] array, int target){ 
    List<Integer> answer = new ArrayList<>();
    for (int i = 0; i<array.length; i++){ 
        if (array[i] % target == 0) {
            answer.add(array[i]); // pushing to list only if the number is divisible
        } 
    } 
    return answer.toArray(new Integer[0]); // converting the list to an array before returning
}

Если вы хотите список уникальных номеров, используйте Set вместо списка.

Set<Integer> answer = new HashSet<>();
0 голосов
/ 27 февраля 2019

Основная идея состоит в том, чтобы заполнить массив ответов снизу, а затем обрезать его до нужного размера.

int j = 0;
for (int i=0; i<array.length; i++) {
   if (array[i] % target == 0){
       answer[j++] = array[i];
   }
}
return Arrays.copyOf(answer, j);

Массивы - это стандартный класс утилит Java.

Если вам не разрешено использовать служебный класс Arrays, тогда последняя строка может быть заменена на:

int[] answer2 = new int[j];
for (int i=0; i<j; i++)
   answer2[i] = answer[i];
return answer2;

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

0 голосов
/ 27 февраля 2019

Два варианта:

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

  • при работе только с массивами вы можете просто сделать 2 прохода: сначала создайте этот большой массив и заполните его.Тогда посчитайте ненулевые записи!Создайте новый массив с меньшей длиной, а затем вручную скопируйте все ненулевые элементы.

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