0

我必须制作一个程序,从输入数组中获取重复字符并打印出一个包含所有唯一字符的新数组。

这一切都有效。除非取出字符,否则它会在该新数组的末尾留下一个空框。

public class Deleter {

public static void main (String[] args){
    Scanner keyboard = new Scanner(System.in);

    char[] initialInputArray = new char[15];

    System.out.println("How many characters do you wish to enter?");

    int size = keyboard.nextInt();

    while ( size > initialInputArray.length ) {
        System.out.println("Error. Enter smaller number.");
        size = keyboard.nextInt();
    }
    if( initialInputArray.length <= 15) {           
        for ( int counter = 0; counter < size; counter++ ){             
            initialInputArray[counter] = keyboard.next().charAt(0);         
        }
        {

        }
    }

    deleteRepeats(initialInputArray, size); 
    //Comeback to print out array
    {
        for ( int helloWorld = 0 ; helloWorld < size ; helloWorld ++)
            System.out.print(  initialInputArray[helloWorld] );
    }
}



//"deleteReapets" method begins, looking for repeated user inputs
public static char[] deleteRepeats (char[] methodArray, int sizeTwo) {

    if (sizeTwo == 0)
        return methodArray;

    if (sizeTwo == 1)
        return methodArray;

    int uniqueCharacter = 1; 
    //Start at the second entered character.

    for (int x = 1; x < sizeTwo; ++x) { 
        int y;

        for (y = 0; y < uniqueCharacter; ++y) {
            if (methodArray[x] == methodArray[y]) break; // break if we find duplicate.
        }


        if (y == uniqueCharacter) {
            methodArray[uniqueCharacter] = methodArray[x]; // add
            ++uniqueCharacter; // increment uniqueCharacter...[0,uniqueCharacter) is still "unique char list"

        }
    }
    while ( uniqueCharacter < sizeTwo ) {
        methodArray[uniqueCharacter] = 0;
        uniqueCharacter++;

    }

            return methodArray;
}

}

4

3 回答 3

1

该空框是您在数组末尾添加的空字符。您正在打印它们,因为您没有size根据唯一字符的数量(可能小于输入大小)进行调整。由于您没有创建新数组,因此您不需要返回char []from deleteRepeats。相反,您可以返回唯一字符的数量。这样,调用程序就知道要打印多少。

如果您的分配要求deleteRepeats返回 a char[],那么您应该分配一个长度完全等于 的新数组uniqueCharacter,将唯一字符复制到其中,然后返回它。调用程序可以只打印那个新的(和更短的)数组,而不是打印size输入的第一个元素。

于 2012-09-12T01:51:10.440 回答
1

可能最简单的方法是创建一个与您的字符数组大小相同的新数组,然后将所有字符复制到其中。数组的问题在于,一旦它们被初始化,它们就无法调整大小。如果您熟悉 arrayLists,我建议您使用它们。但如果不尝试这样的事情......

int count = 0;
for(int i = 0; i < initialInputArray.size; i++){
        count++;
}

char[] newArray = new char[count];


for(int i = 0; i < count; i++){
        newArray[i] = initialInputArray[i];
}
于 2012-09-12T01:53:04.467 回答
0

我建议使用HashSet删除重复项并将您的 char 包装到Character。像这样的东西:

public static Character[] deleteRepeats (char[] methodArray){
    HashSet<Character> set = new HashSet<Character>();

    for(int index = 0; index < methodArray.length; index++){
        set.add(methodArray[index]);
    }

    return set.toArray(new Character[set.size()]);
}

所以在你的主要方法中,你会做的是这样的:

Character[] charArray = deleteRepeats(methodArray);
for(int index = 0; index < charArray.length; index++){
    System.out.println(charArray[index]);
}
于 2012-09-12T02:00:13.140 回答