0

小さな色合いのメソッドの作成に取り組んできましたが、同じIndexOutOfBoundsExceptionエラーが発生し続けます。私はこれに多くを見逃しているとは思わないでしょうか?

import java.util.ArrayList;

public class Shades {

    public static String shades(String hex, int offset) {
        hex = hex.replace("#", "");
        String[] rgb_hex = hex.split(".{2}");
        ArrayList<Integer> rgb_int = new ArrayList<>();
        for (String i : rgb_hex) {
            int intg = Math.min(255, Math.max(
                    0, Integer.parseInt(i, 16) + offset));
            rgb_int.add(intg);
        }
        return String.format("%02x%02x%02x", rgb_int.get(0), 
            rgb_int.get(1), rgb_int.get(2));
    }
    public static void main(String[] args) {
        System.out.println(shades("#000000", 20));
    }
}
4

2 に答える 2

1

グレイは正しい。 任意の 2 文字でhex.split(".{2}")分割します。hexx の長さが 10 などの偶数の場合、最初の 2 文字の後、文字 2 と 4 の後などで分割されます。テストでは、空の配列が返されます。

文字列内の文字を反復処理する必要があります。Java 8にはIteratorこのための機能があるかもしれませんが、それまでは以下が必要です。

public class Shades {
    public String shades(String hex, int offset) {
        hex = hex.replace("#", "");
        if (hex.length() != 6) {
            throw new IllegalArgumentException("Can only handle 6-hex " + 
                "character RGB strings.");
        }
        List<String> rgbHex = splitIntoPairs(hex);
        List<Integer> rgbInt = convertToInt(rgbHex, offset);

        return String.format("%02x%02x%02x", rgbInt.get(0), 
            rgbInt.get(1), rgbInt.get(2));
    }

    public List<String> splitIntoPairs(String s) {
        List<String> pairs = new ArrayList<>();
        pairs.add(s.substring(0, 2));
        pairs.add(s.substring(2, 4));
        pairs.add(s.substring(4, 6));
        return pairs;
    }

    public List<Integer> convertToInts(List<String> s, int offset) {
        List<Integer> ints = new ArrayList<();
        for (String pair: s) {
            ints.add(bound(0, Integer.parseInt(s, 16) + offset, 255);
        }
        return ints;
    }

    public int bound(int lower, int x, int upper) {
        if (x < lower) {
            return lower;
        } else if (x > upper) {
            return upper;
        } else {
            return x;
        }
    }

    public static void main(String[] args) {
        Shades shades = new Shades();
        System.out.println(shades.shades("#000000", 20));
    }
}

メソッドが分割され、より適切な名前が付けられていることに注意してください。

于 2013-04-19T04:52:00.160 に答える