2D массив в Java, проиндексированный символами - PullRequest
0 голосов
/ 26 февраля 2011

Если я не ошибаюсь, в Java допустимо индексировать массив по символьным значениям, поскольку они эквивалентны 8-битным числам. Однако следующий код генерирует для меня сообщения об ошибках:

int[][] myArray = new int[256][256];
myArray['%']['^'] = 25;

Есть ли способ заставить эту работу?

edit : Ух ты, я действительно не очень хорошо справился с копированием кода.

Ответы [ 4 ]

2 голосов
/ 26 февраля 2011

Это не является незаконным, потому что в Java (и других языках) символ в этом случае будет приведен к int.Например, (int)'%'

Примерно так будет безопаснее, если вы не знаете, каким будет значение типа char.

int[][] myArray = new int[Character.MAX_VALUE][Character.MAX_VALUE];
myArray['%']['^'] = 24;

Это будет работать, поскольку Java переведет его в:

myArray[37][94] = 24;

Убедитесь, что вы поместили максимальное значение символа (как уже сделано), что в основном равно "?"что означает 65535. Или вы получите ArrayOutOfBoundsException .

Если вы знаете свой диапазон, вы все равно можете использовать 256. Просто убедитесь, что вы правильно проверяете границы, где ввод>> 0 и <256. </p>

public int getItem(int x, int y) {
  if ((x < 0 && x > 255) || (y < 0 && y > 255)) {
    return -1; // Or you can throw an exception such as InvalidParameterException
  }
  return myArray[x, y];
}

Воспроизводится проверка границ ошибокважная роль для этого.

Я бы переосмыслил то, что вы пытаетесь сделать, что-то вроде этого нечитаемо, чего вы пытаетесь достичь?Возможно, вы можете использовать другие коллекции ?

РЕДАКТИРОВАТЬ

Изменены типы, так как вы изменили код.

1 голос
/ 26 февраля 2011

Символы эквивалентны 16-разрядному целому числу без знака, но это действительно ужасный недостаток дизайна в Java, и его не следует злоупотреблять.Концептуально тип char обозначает символ, а не какое-то целое значение, которое оказывается отображенным на символ (или даже на часть символа в случае суррогатных пар).

Интерфейс Mapследует использовать для сопоставления чего-либо с чем-либо.Массивы следует использовать только в том случае, если тип индекса представляет собой полноценный целочисленный тип, то есть должен использоваться как таковой.И когда эти индексы не укладываются в фиксированный интервал, поэтому вы заранее не знаете размер массива, лучше использовать Map для отображения целых чисел, а не изменять размер массива каждый раз.

Также рассмотрите использование памяти.Для 8-битных символов (ASCII) вы можете обойтись с 256x256x4 = 256K байтов памяти.Но вы убиваете возможность интернационализации вашего приложения таким образом, что является серьезным преступлением.Для поддержки всего 16-битного диапазона вам понадобится 64Kx64Kx4 = 16G байт!И у вас все еще не будет полной поддержки символов за пределами этого диапазона, но опять же у вас не будет и с картой, это недостаток Java, а не ваша.Однако это не так, что многим это нужно.

0 голосов
/ 26 февраля 2011
0 голосов
/ 26 февраля 2011

Это работает (я имею в виду, что это компилируется):

int[][] myArray = new int[256][256];
myArray['%']['^'] = 10;

Ошибка:

  1. у вас есть разные имена для массивов: первое - myArray, а второе - table
  2. myArray - это массив массивов int, но вы присвоили строку ячейке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...