java 我被卡住了,我需要调整我的循环,这样它们就可以继续比较我的两个数组,但不会打印出所有额外的字符

qacovj5a  于 2023-02-14  发布在  Java
关注(0)|答案(2)|浏览(101)

我必须比较两个字符串数组。如果myArray中的任何字符与argArray中的字符匹配,那么我需要交换myArray中字符的大小写。我几乎做到了,但得到了额外的输出。
这是我目前掌握的-

public class Main {
    public static void main(String[] args) {

        Main ob = new Main();
        ob.reverse("bcdxyz@3210.");

    }
    public String reverse(String arg) {

        String reverseCap = "";
        String myStr = "abc, XYZ; 123.";

        char[] argArray = arg.toCharArray();
        char[] myArray = myStr.toCharArray();

        for (int i =0; i < myArray.length; i++) {
            for (int j =0; j < argArray.length; j++){
                if (myArray[i] == argArray[j] && Character.isLowerCase(myArray[i])){
                    reverseCap += Character.toUpperCase(myArray[i]);
                } else if (myArray[i] == argArray[j] && Character.isUpperCase(myArray[i])){
                    reverseCap += Character.toLowerCase(myArray[i]);
                } else {
                    reverseCap += myArray[i];
                }
            }
        }
        System.out.println(reverseCap);
        return null;
    }

我希望reverseCap为“aBC,xyz,123”,但得到的结果如下-

"aaaaaaaaaaaaBbbbbbbbbbbbcCcccccccccc,,,,,,,,,,,,            XXXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZZZZZ;;;;;;;;;;;;            111111111111222222222222333333333333............
".

我已经盯着这个看了几个小时了所以我想是时候在我把眼睛挖出来之前寻求帮助了。

imzjd6km

imzjd6km1#

有了这部分

} else {
    reverseCap += myArray[i];
}

每次迭代都要向reverseCap中添加一个字符,而不管字符是否匹配。
在您的特定示例中,您可以忽略这一点,因为myStr中的每个字符也会出现在arg中,但是如果您想向reverseCap添加字符,即使它们没有出现在arg中,您也需要一种方法来检查您是否已经向reverseCap添加了字符。

soat7uwm

soat7uwm2#

变更

String reverseCap = "";

char[] reverseCap = new char[myStr.length()];

然后对于每次出现

reverseCap +=

将其改为

reverseCap[i] =

最后,将reverseCap转换为String:

String result = String.valueOf(reverseCap);

当前正在返回null。请考虑返回result,并将System.out.println(...)移到main()方法中。
更新:我认为一个更好的方法是使用一个包含大小写对及其逆的查找Map来获得替换字符。嵌套的for循环有点粗糙。

/**
     * Example: for the string "bcdxyz@3210."
     * the lookup map is 
     * {B=b, b=B, C=c, c=C, D=d, d=D, X=x, x=X, Y=y, y=Y, Z=z, z=Z}
     * <p>
     * Using a map to get the inverse of a character is faster than repetitively 
     * looping through the string.
     * </p>
     * @param arg
     * @return
     */
    public String reverse2(String arg) {
        Map<Character, Character> inverseLookup = createInverseLookupMap(arg);
        
        String myStr = "abc, XYZ; 123.";
        String result = myStr.chars()
            .mapToObj(ch -> Character.toString(inverseLookup.getOrDefault(ch, (char) ch)))
            .collect(Collectors.joining());

        return result;
    }

    private Map<Character, Character> createInverseLookupMap(String arg) {
        Map<Character, Character> lookupMap = arg.chars()
            .filter(ch -> Character.isLetter(ch))
            .mapToObj(this::getPairs)
            .flatMap(List::stream)
            .collect(Collectors.toMap(Pair::key, Pair::value));

        System.out.println(lookupMap);
        return lookupMap;
    }

    private List<Pair> getPairs(int ch) {
        char upperVariant = (char) Character.toUpperCase(ch);
        return List.of(
            new Pair(upperVariant, Character.toLowerCase(upperVariant)),
            new Pair(Character.toLowerCase(upperVariant), upperVariant));
    }

    static record Pair(Character key, Character value) {
    }

但是如果不习惯Java流API,这看起来也有点粗糙。

相关问题