Java 2d Array удаляет элемент и возвращает

У меня проблема в массиве java 2d, где я ввожу элементы, используя поле ввода и кнопку для вывода: 1,2,3,4 5, и если я удалю элемент, например 3 и 4, следующий результат должен быть 1,2, 5,3,4. Я хотел бы получить ваши советы. Спасибо.

Что вы пробовали до сих пор? Пожалуйста, покажите код. Вы также можете прочитать Как спросить. При этом, почему удаление 3 и 4 из 1,2,3,4,5 приводит к 1,2,5,3,4? Они не удаляются, а просто добавляются в конец? Что произойдет, если я удалю 4 и 3, тогда на выходе будет 1,2,5,4,3?

Thomas 31.03.2021 12:27

Я делаю графический интерфейс с циклом for для идентификатора клиента, который добавляет +1, если пользователь вводит свое имя. Таким образом, вывод идентификатора клиента будет 1,2,3,4,5. Поэтому, если я удалю 3-ю и 4-ю строки, в следующий раз, когда пользователь введет свое имя, на выходе будет 1,2,5,3,4. Вместо 1,2,5,6.

Michael Andy 31.03.2021 13:12

Итак, вы в основном хотите повторно использовать идентификаторы? В этом случае вам нужно будет вести список неиспользуемых идентификаторов или диапазонов (диапазон [max_id-1,] может быть неявным). Однако обратите внимание, что это часто невозможно в реальных приложениях и может быть опасно. Подумайте о том, как SO поддерживает список забаненных пользователей по имени (идентификатор, чтобы упростить его): что, если какой-то «Майкл Энди» внесет его в этот список, а затем удалит профиль. Теперь вы пытаетесь создать профиль и сразу получаете бан, потому что ваше имя все еще в этом списке - это будет правильно? Подобные вещи могут произойти, если вы повторно используете идентификаторы.

Thomas 31.03.2021 13:23

Да, чтобы повторно использовать удаленный идентификатор для следующего пользователя вместо продолжения с последнего идентификатора.

Michael Andy 31.03.2021 13:32

@MichaelAndy, подойдет ли вам мой ответ ниже?

IntoVoid 31.03.2021 16:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
33
1

Ответы 1

Это должно работать:

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;
    }
}

Другие вопросы по теме