Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827

Копирование массива

27.09.2015, 23:06. Показов 3254. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые!
Новичок, совсем ещё зелёный, только ещё учусь программированию на Java. Такой вот вопрос поставил меня в тупик: если массив задан однозначно (указанием элементов), то копирование проходит замечательно, а вот ежели элементы заполняются программно (Math.random к примеру), то результат копирования либо нули, либо ранее определённые значения. Перепробовал все известные мне варианты копирования массивов - результат один и тот же.
Может подскажете, что не так?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.Arrays;
public class TestMassive {
    int array[] = {15, 2, 6, 87, 21, 63, 4, 10, 24, 5};
    public void iniArray(){
        for(int i = 0; i < array.length; i++){
            array[i] = (int) (Math.random() * 100 - Math.random() * 20);
        }
        System.out.print("Исходный массив: \n" + Arrays.toString(array)+ "\n");
    }
    int sysArrayCopy[] = new int[10];
    public void sysCopy(){
        
        System.arraycopy(array, 0, sysArrayCopy, 0, array.length);
        System.out.print("Первая копия массива: \n" + Arrays.toString(sysArrayCopy) + "\n");
    }
    int cloneArray[] = new int[10];
    public void clonArray(){
        cloneArray = (int []) array.clone();
        System.out.print("Вторая копия массива: \n" + Arrays.toString(cloneArray) + "\n");
    }
    int arrayCopyOf[] = new int[10];
    public void arrCopOf(){
        arrayCopyOf = Arrays.copyOf(array, array.length);
        System.out.print("Третья копия массива: \n" + Arrays.toString(arrayCopyOf) + "\n");
    }
    int handCopy[] = new int[array.length];
    public void hCopy(){
        for(int i = 0; i < array.length; i++){
            handCopy[i] = array[i];
        }
        System.out.print("Четвёртая копия массива: \n" + Arrays.toString(array) + "\n");
    }
}
Добавлено через 8 часов 56 минут
М-м-м-дя... Давайте я ещё вот эту часть кода добавлю, может так проще будет? Это, собственно, запуск самих методов...
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
 
        TestMassive eraE = new TestMassive();
        eraE.iniArray();
 
        TestMassive sysCop = new TestMassive();
        sysCop.sysCopy();
        
        TestMassive clonE = new TestMassive();
        clonE.clonArray();
        
        TestMassive arrCopy = new TestMassive();
        arrCopy.arrCopOf();
        
        TestMassive handCop = new TestMassive();
        handCop.hCopy();
    }
    
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.09.2015, 23:06
Ответы с готовыми решениями:

Копирование массива
Недавно начал изучать Java по Хорстманну.

Копирование массива
Люди помогите, пожалуйста, где я ошибаюсь? Вот код, в котором ошибка после копирования массива: public void AddStudent() { ...

Копирование массива
Удалить из массива каждый третий элемент (копированием) public class zadanie4 { public static void main(String args) { int...

7
 Аватар для korep
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 626
27.09.2015, 23:21
откуда sysCopy возьмет предыдущий массив?

Добавлено через 3 минуты
у вас в такой записи может отработать только iniArray

Добавлено через 8 минут
Хотя что-то я туплю.
Дайте лог и вывод.
0
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
28.09.2015, 00:37  [ТС]
NetBeans выдаёт следуюющее:

Первая строка - это исходный массив, который сначала задан значениями, а потом обработан заполнением случайными числами...
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
28.09.2015, 10:56
Возвращай массив... ты ничего методом не возвращаешь и как же ты можешь из него скопировать потом???

Добавлено через 21 минуту
Зачем ты каждый раз создаёшь разные экземпляры??? Смотри, что получается, что у eraE ты да, изменил переменную array.. затем ты создал новый экземпляр класса sysCop и создал новую переменную array, в которой не вызвал метод iniArray(); Следовательно массив у тебя тот, который присвоил в самом начале...

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
 
        TestMassive eraE = new TestMassive();
        eraE.iniArray();
 
        TestMassive sysCop = new TestMassive();
        sysCop.sysCopy();
        
        TestMassive clonE = new TestMassive();
        clonE.clonArray();
        
        TestMassive arrCopy = new TestMassive();
        arrCopy.arrCopOf();
        
        TestMassive handCop = new TestMassive();
        handCop.hCopy();
    }
    
}
Решение:

Java
1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
 
        TestMassive eraE = new TestMassive();
        eraE.iniArray();        
        eraE.sysCopy();      
        eraE.clonArray();
        eraE.arrCopOf();        
        eraE.hCopy();
    }
    
}
Не надо создавать столько экземпляров...достаточно одного eraE или ты просто каждый раз в памяти создаёшь объект с "нуля", так сказать. В памяти 5 копий класса и все разные )))

Добавлено через 14 секунд
Зачем ты каждый раз создаёшь разные экземпляры??? Смотри, что получается, что у eraE ты да, изменил переменную array.. затем ты создал новый экземпляр класса sysCop и создал новую переменную array, в которой не вызвал метод iniArray(); Следовательно массив у тебя тот, который присвоил в самом начале...

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
 
        TestMassive eraE = new TestMassive();
        eraE.iniArray();
 
        TestMassive sysCop = new TestMassive();
        sysCop.sysCopy();
        
        TestMassive clonE = new TestMassive();
        clonE.clonArray();
        
        TestMassive arrCopy = new TestMassive();
        arrCopy.arrCopOf();
        
        TestMassive handCop = new TestMassive();
        handCop.hCopy();
    }
    
}
Решение:

Java
1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
 
        TestMassive eraE = new TestMassive();
        eraE.iniArray();        
        eraE.sysCopy();      
        eraE.clonArray();
        eraE.arrCopOf();        
        eraE.hCopy();
    }
    
}
Не надо создавать столько экземпляров...достаточно одного eraE или ты просто каждый раз в памяти создаёшь объект с "нуля", так сказать. В памяти 5 копий класса и все разные )))

Добавлено через 1 минуту
Залаговал сайт, дважды отправилось сообщение... Простите за спам )
1
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
28.09.2015, 12:21  [ТС]
Да, спасибо, в такой нотации копируется сгенерированный массив.
Ok!
Буду разбираться с фразой: "Возвращай массив... ты ничего методом не возвращаешь и как же ты можешь из него скопировать потом?"
Спасибо вам ещё раз.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
28.09.2015, 12:51
Лучший ответ Сообщение было отмечено HOBATOP как решение

Решение

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

А вот когда ты создал в памяти лишь одну копию класса, то его методы и работают с данными одного массива. А в твоём примере было создано 5 объектов одного и того же класса и все они не взаимосвязаны с друг другом... Получается у первого eraE ты изменил методом массив, а потом создал новый экземпляр, который не знает, что ты изменил массив, т.к. это совсем другой экземпляр класса... И у sysCop array стал тот, который ты присвоил вначале...

Добавлено через 2 минуты
В принципе и твой код можно сделать работоспособным, если к переменной array допишешь static:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.Arrays;
public class TestMassive {
    static int array[] = {15, 2, 6, 87, 21, 63, 4, 10, 24, 5};
    public void iniArray(){
        for(int i = 0; i < array.length; i++){
            array[i] = (int) (Math.random() * 100 - Math.random() * 20);
        }
        System.out.print("Исходный массив: \n" + Arrays.toString(array)+ "\n");
    }
    int sysArrayCopy[] = new int[10];
    public void sysCopy(){
        
        System.arraycopy(array, 0, sysArrayCopy, 0, array.length);
        System.out.print("Первая копия массива: \n" + Arrays.toString(sysArrayCopy) + "\n");
    }
    int cloneArray[] = new int[10];
    public void clonArray(){
        cloneArray = (int []) array.clone();
        System.out.print("Вторая копия массива: \n" + Arrays.toString(cloneArray) + "\n");
    }
    int arrayCopyOf[] = new int[10];
    public void arrCopOf(){
        arrayCopyOf = Arrays.copyOf(array, array.length);
        System.out.print("Третья копия массива: \n" + Arrays.toString(arrayCopyOf) + "\n");
    }
    int handCopy[] = new int[array.length];
    public void hCopy(){
        for(int i = 0; i < array.length; i++){
            handCopy[i] = array[i];
        }
        System.out.print("Четвёртая копия массива: \n" + Arrays.toString(array) + "\n");
    }
}
static - статическая переменная, которая при изменении меняется во всех экземплярах класса... Следовательно тогда сделав 5 экземпляров eraE, sysCop и т.д. при изменении array, он изменится везде, т.к. примитивная переменная static!!!
0
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
28.09.2015, 20:07  [ТС]
Я же сразу сказал: только-только начал чего-то изучать в Java. Постепенно въезжаю, но вот про тонкость переменной со "static" пока что не читал. Это самое то, что мне было нужно. То есть теперь в любом другом классе ссылаясь на данный код, я получу одни и те же значения и каждый раз разные! Класс.
Спасибо!
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
28.09.2015, 20:15
не за что )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.09.2015, 20:15
Помогаю со студенческими работами здесь

Копирование двумерного массива
Код ниже. Грубо говоря, он делит строку на маленькие подстрочки меньшего размера (чанки фиксированной величины, для примера 10), получается...

Копирование массива(книга Шилдта)
public class Ragged { public static void main(String args) { int i; int nums1 = new int; int nums2 =...

Копирование массива в центр другого массива
Комрады. рад приветствовать всех. Я новичок в ИТ и программировании и прохожу обучение. Добавлено через 9 минут подскажите знающие,...

Копирование массива
Пожалуйста, подскажите, как создать автономную копию массива, чтобы при изменении оригинала копия не менялась (и наоборот).

Копирование массива
Привет. Я должен скопировать из списка с список все элементы при этом дублируя их два раза, прим: оригинал: копия: ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
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
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru