【问题标题】:how can I make charAt method work with arrays in java?如何使 charAt 方法与 java 中的数组一起使用?
【发布时间】:2020-05-04 09:23:22
【问题描述】:

有人可以帮我解决这个问题吗?我必须让方法 charAt 工作,但我不知道如何..

class AsciiCharSequence implements java.lang.CharSequence/* extends/implements */ {
    // implementation
    byte[] array;

    public AsciiCharSequence(byte[] array) {
        this.array = array.clone();
    }

    @Override
    public int length() {
        return array.length;
    }

    *@Override
    public char charAt(int i) {
        return (char) array.length(i);
    }*

【问题讨论】:

  • return (char) array[i];(尽管不需要显式转换)。

标签: java charat


【解决方案1】:

试试这个:

@Override
public char charAt(int i) {
    return (char) array[i];
}

因为您有一个数组并且想要返回特定数组中的字符。在您的问题中,您没有返回特定的索引值。

【讨论】:

  • 虽然显式转换不是一个好习惯,但尽量避免!
【解决方案2】:

使用[] 访问数组中的元素。但不要忘记抛出所需的异常,就像它在 CharSequence 文档中声明的那样(如果您访问的数组中的元素不正确,则会引发另一种类型的异常)。

public class AsciiCharSequence implements CharSequence {

    private static final char[] EMPTY_ARRAY = new char[0];

    private final char[] arr;

    public AsciiCharSequence(char[] arr) {
        this.arr = arr == null || arr.length == 0 ? EMPTY_ARRAY : Arrays.copyOf(arr, arr.length);
    }

    private AsciiCharSequence(char[] arr, int start, int end) {
        this.arr = arr == null || arr.length == 0 || start == end ? EMPTY_ARRAY : Arrays.copyOfRange(arr, start, end);
    }

    @Override
    public int length() {
        return arr.length;
    }

    @Override
    public char charAt(int i) {
        if (i < 0 || i >= length())
            throw new IndexOutOfBoundsException();

        return arr[i];
    }

    @Override
    public AsciiCharSequence subSequence(int start, int end) {
        if (start < 0 || end < 0)
            throw new IndexOutOfBoundsException();
        if (end > length())
            throw new IndexOutOfBoundsException();
        if (start > end)
            throw new IndexOutOfBoundsException();

        return new AsciiCharSequence(arr, start, end);
    }

    @Override
    public String toString() {
        return IntStream.range(0, arr.length).mapToObj(i -> String.valueOf(arr[i])).collect(Collectors.joining());
    }
}

【讨论】:

    【解决方案3】:

    为了更好地理解字符集可以参考下面的代码来自 AbstractStringBuilder

     @Override
    public char charAt(int index) {
        checkIndex(index, count);
        if (isLatin1()) {
            return (char)(value[index] & 0xff);
        }
        return StringUTF16.charAt(value, index);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-17
      • 2013-09-03
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多