У меня проблема в массиве java 2d, где я ввожу элементы, используя поле ввода и кнопку для вывода: 1,2,3,4 5, и если я удалю элемент, например 3 и 4, следующий результат должен быть 1,2, 5,3,4. Я хотел бы получить ваши советы. Спасибо.
Я делаю графический интерфейс с циклом for для идентификатора клиента, который добавляет +1, если пользователь вводит свое имя. Таким образом, вывод идентификатора клиента будет 1,2,3,4,5. Поэтому, если я удалю 3-ю и 4-ю строки, в следующий раз, когда пользователь введет свое имя, на выходе будет 1,2,5,3,4. Вместо 1,2,5,6.
Итак, вы в основном хотите повторно использовать идентификаторы? В этом случае вам нужно будет вести список неиспользуемых идентификаторов или диапазонов (диапазон [max_id-1,] может быть неявным). Однако обратите внимание, что это часто невозможно в реальных приложениях и может быть опасно. Подумайте о том, как SO поддерживает список забаненных пользователей по имени (идентификатор, чтобы упростить его): что, если какой-то «Майкл Энди» внесет его в этот список, а затем удалит профиль. Теперь вы пытаетесь создать профиль и сразу получаете бан, потому что ваше имя все еще в этом списке - это будет правильно? Подобные вещи могут произойти, если вы повторно используете идентификаторы.
Да, чтобы повторно использовать удаленный идентификатор для следующего пользователя вместо продолжения с последнего идентификатора.
@MichaelAndy, подойдет ли вам мой ответ ниже?




Это должно работать:
public static final class ID {
private static final int INC_SIZE = Long.SIZE * 2;
private long[] mBits;
private int mCap, mOff;
public ID() {
clear();
}
public void clear() {
mBits = nBits(mCap = INC_SIZE);
mOff = 0;
}
public int next() {
while (mOff < mCap && hasBit(mBits, mOff)) mOff++;
if (mOff >= mCap) mBits = nBits(mBits, mCap += INC_SIZE);
setBit(mBits, mOff);
return mOff++;
}
public boolean has(int id) {
if ((id | mCap - 1 - id) < 0) return false;
return hasBit(mBits, id);
}
public void remove(int id) {
if ((id | mCap - 1 - id) < 0) return;
mOff = Math.min(mOff, id);
remBit(mBits, id);
}
static long[] nBits(int n) {
return new long[((n - 1) >> 6) + 1];
}
static long[] nBits(long[] bits, int n) {
int nLen = ((n - 1) >> 6) + 1, cLen = Math.min(nLen, bits.length);
long[] nBits = new long[nLen];
System.arraycopy(bits, 0, nBits, 0, cLen);
if ((1L << n) != 1L) nBits[n >> 6] &= ~(~0L << n);
return nBits;
}
static void setBit(long[] bits, int i) {
bits[i >> 6] |= 1L << i;
}
static void remBit(long[] bits, int i) {
bits[i >> 6] &= ~(1L << i);
}
static boolean hasBit(long[] bits, int i) {
return (bits[i >> 6] & (1L << i)) != 0L;
}
}
Что вы пробовали до сих пор? Пожалуйста, покажите код. Вы также можете прочитать Как спросить. При этом, почему удаление 3 и 4 из 1,2,3,4,5 приводит к 1,2,5,3,4? Они не удаляются, а просто добавляются в конец? Что произойдет, если я удалю 4 и 3, тогда на выходе будет 1,2,5,4,3?