Как скопировать элементы во второй массив без символов верхнего регистра?

Мне нужно скопировать элементы одного массива в другой массив удалить верхний регистр и просто скопировать нижний регистр. Буду признателен за помощь.

Я использовал System.arraycopy() и выводом является сумма заглавных букв:

5 [a, B, c, R, n, k, W, v, t, G, L]

Это мой код

package question4;

import java.util.Arrays;

public class CharArray {



    public static void main(String[] args){
        char[] array = new char[]{'a','B','c','R','n','k','W','v','t','G','L',};
        char[] newarray = new char[array.length];

        int n = 0;
        for(int i = 0 ; i< array.length; i ++){
         if(Character.isUpperCase(array[i])){
             n++;
            System.arraycopy(array, 0, newarray, 0, array.length); 

         }
        }
        System.out.println("the sum of uperCase is : " + n);
        System.out.println(Arrays.toString(newarray));


    }
}

4 ответа

Каждый символ имеет представление ASCII. Вы можете получить его, просто приведя char к int: int aCode = (int) 'a'; установит значение aCode равным 97. Символы нижнего регистра начинаются с кода 97-122, все символы верхнего регистра ниже 97.

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

int lowerCount = 0;
for (int i = 0; i < array.length; i++) {
    if ((int) array[i] >= 97 && (int) array[i] <= 122) lowerCount++;
}

Теперь давайте объявим новый массив символов с вычисленным размером:

char[] newArray = new char[lowerCount];

Теперь вы можете начать копировать символы нижнего регистра в новый массив:

int newIndex = 0;

for (int i=0; i<array.length; i++) {
    if ((int) array[i] >= 97 && (int) array[i] <= 122) {
        newArray[newIndex] = array[i];
        newIndex++;
    }
}

System.out.println("The lower case chars are:" + Arrays.toString(newArray) + "; There are " newArray.length + " of them.);
System.out.println((array.length-newArray.length) + " capital chars werde removed.")

Вам нужен newIndex, чтобы запомнить, сколько символов вы уже скопировали в новый массив - означает, по какому индексу хранить следующий найденный символ нижнего регистра.

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

List<Character> chars = new ArrayList<Character>();
for (Character c : array) {
   if (Character.isLowerCase(c)) {
      chars.add(c);
   }
}
Character[] lowerCase = chars.toArray(new Character[0]);

Это немного проще, чем беспокоиться о System.arrayCopy() (который я бы предпочел использовать для массовых копий, а не просто для копирования отдельных элементов) и всех смещений, которые вы поддерживаете.

Обратите внимание, что результирующий массив - это размер числа строчных элементов, с которыми он был заполнен (в отличие от заранее определенного массива статического размера, как указано выше)

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

Возьмите временный массив для хранения значений, а затем скопируйте эти значения в ваш newArray в соответствии с длиной заглавных букв.

public static void main(String[] args){
  char[] array = new char[]{'a','B','c','R','n','k','W','v','t','G','L',};
  char[] temp = new char[array.length];

  int cnt = 0;
  int n = 0;

  for(int i = 0 ; i< array.length; i ++){
    if(Character.isUpperCase(array[i])){
        n++;
        temp[cnt++]=array[i];  // put your values in temp array
    }
  }

 System.out.println("the sum of uperCase is : " + n);

    char[] newarray = new char[cnt]; // cnt giving no of capital letters
    System.arraycopy(temp, 0, newarray, 0, cnt); // copy temp array to new array
    System.out.println(Arrays.toString(newarray));
  }

Выход

the sum of uperCase is : 5
[B, R, W, G, L]

В настоящее время ваш код копирует все значения array в newarray каждый раз, когда есть заглавные буквы.

Чтобы добиться того, что вы хотите, попробуйте это:

int n = 0;

for(int i = 0 ; i< array.length; i ++){
    if(Character.isUpperCase(array[i])){
       n++;
    }
}

char[] newarray = new char[array.lenght - n];
int index = 0;

for(int i = 0;i < array.lenght;i++){
   if(Character.isLowerCase(array[i])){
       newarray[index++] = array[i];
   }
}
Другие вопросы по тегам