Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14

Нужен совет по коду

31.01.2019, 20:41. Показов 1639. Ответов 14

Студворк — интернет-сервис помощи студентам
Приветствую, хотелось бы услышать ваши предложения по следующей задаче.
Есть array[100] в который мы добавляем 5 элементов (объектов класса, которые уникальны), остальные значения null. У нас есть метод delete(), в который мы передаем значение, по которому хотим найти и удалить один из элементов массива (я его заменяю на null). После чего мы сдвигаем пустую ячейку вправо, передвигая оставшиеся элементы влево. В итоге размер массива не меняется, а оставшиеся элементы красиво сидят в начале массива. Также есть переменная values, которая хранит число элементов массива, которые не null (ее мы используем для того, что бы при поиске элемента внутри массива не перебирать все его элементы, а только те, которые содержат значения). Использовать что-то кроме простого массива нельзя. В общем код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    void delete(String value) {
        for (int i = 0; i < values; i++) {
            if (array[i].value.equals(value)) {
               array[i] = null;
            }
        }
 
        for (int i = 0; i < values-1; i++) {
            Target temp;
            if (array[i] == null & array[i+1] != null) {
                temp = array[i];
                array[i] = array[i + 1];
                array[i + 1] = temp;
            }
        }
}
Какие будут предложения по оптимизации кода?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.01.2019, 20:41
Ответы с готовыми решениями:

Нужен совет по коду
Нужно чтобы через таймер определяло название активного окна и если окно нужное по названию выполняло действие.... в инете нашел пример...

Нужен совет по коду
Нашел батник @Echo Off SetLocal EnableDelayedExpansion :: Файл из которого берем 3 строки (8,9 и 10 строки) Set...

Нужен совет по коду с условием
Недавно начал учить C#.Подскажите пожалуйста, при условии а &gt; b помимо сообщения об ошибке мне так же выдает что Сумма чисел равна: 0. Что...

14
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
31.01.2019, 20:54
Цитата Сообщение от gangmaster Посмотреть сообщение
предложения по оптимизации кода
Не использовать null
0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
31.01.2019, 20:57  [ТС]
В смысле? Не заменять значение ячейки на null? А что тогда лучше с ней сделать?
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
31.01.2019, 21:00
gangmaster, у тебя какой-то неправильный подход в целом. Зачем нужен массив на 99% пустой? Опиши задачу
0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
31.01.2019, 21:21  [ТС]
В этом то вся и фишка, что надо плясать от того, что есть. Яб уже давно все решил при помощи того же ArrayList, но нельзя.
По задаче дано: Пустой массив на 100 элементов. Ты должен добавить в его начало 5 объектов, у которых есть параметр, ну допустим name, то есть Target1.name = "target1". Мы берем этот объект и добавляем его в массив, то есть у нас выходит array[0] = target1, дальше повторяем с остальными четырьмя элементами, в итоге получаем array[target1,target2,target3,target4,target5, null...null]. Далее нас просят удалить объект, который имеет name = "target3". Мы запускаем поиск по имеющимся ячейкам массива, которые не соответствуют null (тоесть target1,target2 ... target5), и ищем соответствие array[i].value.equals(value) ? Если нашли, то меняем его на null (ну я заменяю на null, может есть способ круче, я не знаю), а потом этот null сдвигаем в конец имеющихся значений не равных null, то есть получаем следующие:
array[target1,target2,target4,target5,null...n ull]. Элементов не null стало 4 (что я меняю в значение values, что бы в следующие поиски искать уже среди 4х, а не 5 элементов), а наш массив остался той же длины, что и был, то есть мы не потеряли ячейку, а просто освободили ее для дальнейшего заполнения. Если же программу попросить выдать нам размер массива (его реально заполненные ячейки), то она выдаст значение 4, а не 100, то есть только заполненные ячейки.
Собственно код то работает и делает, что надо, но два цикла - это криво, надо как-то компактней оптимизировать, а как я не допру 8( Да в коде забыл счетчик values уменьшить после удаления элемента.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    void delete(String value) {
        for (int i = 0; i < values; i++) {
            if (array[i].value.equals(value)) {
               array[i] = null;
            }
        }
 
        for (int i = 0; i < values-1; i++) {
            Target temp;
            if (array[i] == null & array[i+1] != null) {
                temp = array[i];
                array[i] = array[i + 1];
                array[i + 1] = temp;
            }
        }
values--;
}
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
31.01.2019, 21:59
Цитата Сообщение от gangmaster Посмотреть сообщение
Какие будут предложения по оптимизации кода?
1) вы удаляете по значению а не по индексу. А если есть несколько одинаковых значений, что тогда?
2) если вы все время используете(удалить, добавить, найти первый, найти все такие что..) элементы массива через доступ к ним по их значению а не по индексу массива, то нет смысла все не нулл вперед. Лишний цикл.
3) Надо использовать больше методов и меньше повторений. Например у вас есть метод boolean delfirst(Target target), значит я бы сделал приблизительно так :
Java
1
2
3
4
5
6
boolean delFirst(Target target) { 
      if(findTarget(target)) {
          getFirst(target) = null;
          return true;
      } else { return false; }
}
Но ясное дело что target это условно говоря, вы же не будете "получать объект методом в аргуманте которого и есть тот самый объект" )))
А вообще сейчас пришла в голову мысль на счет методов pull() and push();

Добавлено через 7 минут
Ну и конечно счетчик на количество поставил бы, при успешном добавлении/удалении
0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
31.01.2019, 22:02  [ТС]
Я писал выше: (объектов класса, которые уникальны), то есть одинаковых по условию задачи нет.
Методы это конечно красиво, но у нас есть метод delete, в котором все и должно реализоваться. Тут как в армии: Вот тебе лопата, строй забор 8)
Кароче я сделал так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    void delete(String value) {
//values = значению не null элементов внутри массива. Допустим оно 5.
        boolean valueExist = false;
        for (int i = 0; i < values; i++) {
            Target temp;
            if (array[i].value.equals(value)) {
                valueExist = true;
                temp = array[i];
                array[i] = array[i + 1];
                array[i + 1] = temp;
            }
        }
        if (valueExist) {
            array[vaules - 1] = null;
            values--;
        } else {
            System.out.println(value + " don't exist.");
        }
Какие советы? 8)
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
31.01.2019, 23:28
Лучший ответ Сообщение было отмечено gangmaster как решение

Решение

gangmaster, вот тебе идея. Метод - одна строка
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) {
        String[] arr = new String[10];
        arr[0] = "3";
        arr[1] = "7";
        arr[2] = "2";
        arr[3] = "9";
 
        System.out.println(Arrays.toString(arr));
 
        // внимание! ПОЗИЦИЯ, а не индекс!
        delete(arr, 3);
        System.out.println(Arrays.toString(arr));
    }
 
    private static void delete(Object[] arr, int pos) {
        System.out.println("Removed position " + pos);
        System.arraycopy(arr, pos, arr, pos - 1, arr.length - pos);
    }
Bash
1
2
3
[3, 7, 2, 9, null, null, null, null, null, null]
Removed position 3
[3, 7, 9, null, null, null, null, null, null, null]
1
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
01.02.2019, 00:48  [ТС]
Это интересно, спасибо 8) Правда у нас по условию задачи передается String value = "имя", но это можно обыграть 8)

Добавлено через 1 час 1 минуту
Если кому интересно будет, дали еще один совет. Без использования arraycopy, с учетом того, что нам без разницы в каком порядке элементы в массиве(мы просто тупо затираем наш value другим элементом, просто переставляя его на место другой элемент массива), ибо мы все равно при поиске перебираем все не null элементы.
Java
1
2
3
4
5
6
7
8
9
10
    void delete(String value) {
        for (int i = 0; i < values; i++) {
            if (array[i].value.equals(value)) {
                Target temp;
                temp = array[values-1];
                array[values-1] = null;
                array[i] = temp;
                values--;
            }
        }
0
 Аватар для Aviz__
2759 / 2066 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
01.02.2019, 10:08
gangmaster, гля, совершенно классическое решение)).
Да, мы же взрослые люди, чтобы не говорить о позиции элемента в массиве...
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args){
        String[] arr = new String[5];
        arr[0] = "3";
        arr[1] = "7";
        arr[2] = "2";
        arr[3] = "9";
        System.out.println(Arrays.toString(arr));
        int indexDelElem = 3;
        for (int i = indexDelElem; i < arr.length - 1; i++) {
            if (arr[i] == null)
                break;
            arr[i] = arr[i + 1];
        }
        System.out.println(Arrays.toString(arr));
    }
Bash
1
2
[3, 7, 2, 9, null]
[3, 7, 2, null, null]
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
01.02.2019, 13:30
Цитата Сообщение от gangmaster Посмотреть сообщение
Без использования arraycopy, с учетом того, что нам без разницы в каком порядке элементы в массиве(мы просто тупо затираем наш value другим элементом, просто переставляя его на место другой элемент массива), ибо мы все равно при поиске перебираем все не null элементы.

Java
1
2
3
4
5
6
7
8
9
10
11
    void delete(String value) {
        for (int i = 0; i < values; i++) {
            if (array[i].value.equals(value)) {
                Target temp;
                temp = array[values - 1];
                array[values - 1] = null;
                array[i] = temp;
                values--;
            }
        }
    }
Тут temp не нужен. Попробуй догадаться почему.
1
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
01.02.2019, 16:23  [ТС]
Да не нужен. Ваша правда

Добавлено через 2 минуты
Aviz__ вот не поверишь, когда мне сказали, что по условию задачи тебе не сказано, что массив должен быть упорядочен, то значит не надо его упорядочивать - мой фейс был таким о_О Ну это просто логичная логичность 8))
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
01.02.2019, 16:36
Цитата Сообщение от gangmaster Посмотреть сообщение
вот не поверишь, когда мне сказали, что по условию задачи тебе не сказано, что массив должен быть упорядочен, то значит не надо его упорядочивать - мой фейс был таким о_О Ну это просто логичная логичность 8))
Судя по всему, ребята не знают про Set.
0
0 / 0 / 0
Регистрация: 26.11.2018
Сообщений: 14
01.02.2019, 16:44  [ТС]
Да нет, это спецом тебя ставят в такие условия, чтоб ты врубил логику и проявил соображалку, как можно проще всего сделать функционал на базовых элементах языка, аля массив в нашем случаи. Просто меня смутило то, что в задании было так:
Схема хранения объектов в массиве array (в элементах от 0 до size-1 отсутствуют null):

r1, r2, r3,..., rn, null, null,..., null
<----- size ----->
<------- storage.length (10000) ------->

Вот я и решил, что они должны идти по-порядку, а в условии про порядок то ничего нет 8)
0
 Аватар для Aviz__
2759 / 2066 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
01.02.2019, 17:50
Цитата Сообщение от gangmaster Посмотреть сообщение
как можно проще
критерий простоты, в каждом конкретном случае свой))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.02.2019, 17:50
Помогаю со студенческими работами здесь

Совет по чужому коду
Доброе время суток всем. Нашел на просторах данный код для отображения checkbox в dbgrid. Ну уж очень все криво работает. Сам не...

Дайте совет по данному коду
Здравствуйте я хочу настроить поиск по базе данных на Access. Я попытался написать следующий код но он работает не корректно а именно он не...

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

Совет по коду: программное создание новой базы
Подскажите, что установить и куда добавить этот код что бы создалась база данных Private Sub Form_Load() Dim dbFile As String '...

Нужен комментарий к коду программы
Барон Мюнхаузен, выйдя на экологически чистую охоту, зарядил свое ружье косточками вишен. После того как он удачно попал между рога оленям,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru