2015-02-04 1 views
1

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

Я использовал 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)); 


    } 
} 

ответ

0

Если вы хотите скопировать только в нижнем регистре, то, так как вы не знаете, сколько элементов массива являются верхний или нижний регистр заранее, я предпочел бы скопировать в динамический размер (например, 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() (который я предпочел бы использовать для насыпных копий, чем просто копирование отдельных элементов) и всех смещений вы поддерживаете.

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

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

+0

Упс. Строчный, а не верхний регистр. Исправленный. Является ли причина для downvote? –

+0

Он хочет поместить все буквы в новый массив и преобразовать существующие прописные буквы в строчные. Не перемещайте верхний регистр или строчный регистр во второй массив. – leigero

+0

Мне это непонятно, особенно учитывая название * Как скопировать элементы во второй массив без символов верхнего регистра? * –

1

Каждый символ имеет представление ASCII. Вы можете получить его простым приведением символа в 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, чтобы запомнить, сколько символов вы уже скопировали в новый массив, - означает, при каком индексе для хранения следующего найденного символа нижнего регистра.

+0

Каждый символ имеет представление Unicode, я бы предложил –

+0

. Каждый символ имеет представление UC, да. Но разбор char в int даст вам код ascii, не так ли? – MichaelS

+0

То, что я делаю, это то, что набор символов Unicode выходит за пределы 7-битного набора ASCII, а расширенные наборы символов будут содержать символы верхнего/нижнего регистра за пределами этого. Я бы предпочел использовать методы верхнего и нижнего регистров символов для обработки этих сценариев. –

-1

В настоящий момент ваш код копирует все значения 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]; 
    } 
} 
+0

Зачем использовать isUpperCase и array.length-n вместо isLowerCase и n как новый размер? – MichaelS

+0

@MichaelS, потому что он также хочет подсчитать общее количество заглавных букв. Это было указано в его вопросе, прежде чем он его редактировал. – Titus

+0

Делает смысл. С другой стороны, количество символов капитала - 'array.length-newarray.length'. Но вы правы, это не важно, когда вы делаете вычитание. – MichaelS

0

Возьмите временный массив для хранения значений, а затем скопировать эти значения в вашем 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]