С пояснением: «Если у меня снова будет тот же номер, мне нужно убедиться, что он отображается на Дейва, а не на что-то другое каждый раз».применяется только до тех пор, пока набор строк не изменяется.
Самое простое, что говорит Маверик, name = names[barcode % names.length];
Java long
достаточно большой, чтобы хранить любой штрих-код UPC, int
нет, поэтому я предполагаю, что barcode
- это long
.Обратите внимание, что последняя цифра штрих-кода UPC - это base-11, это может быть X
.Я оставляю читателю в качестве упражнения, как вы на самом деле отображаете штрих-коды в числа.Один из вариантов - просто отбросить контрольную цифру, как только вы установили, что она правильная - она вычисляется из других, поэтому она не добавляет никакой информации и не делает различий между любыми другими равными кодами.
Но, как Стивен С.говорит, что штрих-коды не случайны, так что это может не дать вам равномерное распределение по именам.
Чтобы получить лучшее распределение, вы могли бы сначала хешировать штрих-код.Например, name = names[String.valueOf(barcode).hashCode() % names.length];
Это все еще может быть не совсем равномерным - есть лучшие, но обычно более медленные хеш-функции, чем String.hashCode
- но это, вероятно, позволяет избежать каких-либо серьезных ошибок, которые могут быть в реальных штрих-кодах.
Кроме того, я не могу вспомнить, возвращает ли оператор модуля Java отрицательные результаты для отрицательного ввода - если это так, то вам нужно привести его в положительный диапазон:
int idx = String.valueOf(barcode).hashCode() % names.length;
if (idx < 0) idx += names.length;