Как скопировать элементы во второй массив без символов верхнего регистра?
Мне нужно скопировать элементы одного массива в другой массив удалить верхний регистр и просто скопировать нижний регистр. Буду признателен за помощь.
Я использовал 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];
}
}