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

Проход по массиву

19.06.2017, 20:01. Показов 1256. Ответов 1

Студворк — интернет-сервис помощи студентам
Программа подсчитывает кол-во единичных и нулевых битов рандомных чисел, в двух разных потоках(в зависимости от аргумента).Нулевые с начала списка, а единичные с конца. Проблема в том, что происходит обработка каждого элемента массива два раза.Как можно исправить программу, чтобы каждый элемент учитывался только один раз, одним из потоков?

Не могу разобраться, как пройти по массиву один раз, при этом обработать элементы в обоих направлениях.У меня получается только два цикла, отдельно для каждого из потоков.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
    private Thread th1 = null;
    private Thread th2 = null;
    List<Integer> linkedList = new LinkedList<Integer>();
    ArrayList<Result> arr_zero;
    Result result_object;
 
public void Start(){            //Создание массива и его заполнение
        Random r = new Random();
        for(int j = 0; j < 10; j++){
            linkedList.add(r.nextInt(100 - 10) + 10);
        }
        initThreads();
    }
 
 
    public void initThreads(){              //Создание потоков и их запуск
        arr_zero = new ArrayList<Result>();
        th1 = new Thread(new Runnable() {
            @Override
            public void run() {     //Первый поток - вычисляет нулевые биты
                CheckNumbers(0);
            }
        });
 
        th2 = new Thread(new Runnable() {       //Второй поток - вычисляет единичные биты
            @Override
            public void run() {
                CheckNumbers(1);
            }
        });
        th1.start();
        th2.start();
    }
 
 
 
    public  void  CheckNumbers(int check_number){     //В зависимости от передаваемого аргумента запускается вычисление единичных или нулевых битов
 
        for(int t = 0; t < linkedList.size(); t++) {
            result_object = new Result();
            arr_zero.add(result_object);
        }
 
        if(check_number == 0){                              //Подсчёт кол-ва нулей до последнего единичного бита
            for(int i = 0; i < linkedList.size(); i++){
 
                int x = linkedList.get(i);
                arr_zero.get(i).Number = Integer.toString(x);
                arr_zero.get(i).Res_Count = Integer.toString(linkedList.size());
                int count = 0;
                while(x != 0){
                    if((x & 1) == 0){
                        count++;
                    }
                    x >>>=1;
                }
                arr_zero.get(i).Res_Zero = Integer.toString(count);
            }
        } else if(check_number == 1)                        //Подсчёт кол-ва единичных битов
        {
            for(int i = linkedList.size()-1; i >= 0; i--) {
                int count_2 = 0;
 
                int elements = linkedList.get(i);
 
                while (elements != 0) {
                    count_2++;
                    elements = elements & (elements - 1);
                }
                arr_zero.get(i).Res_One = Integer.toString(count_2);
            }
        }
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2017, 20:01
Ответы с готовыми решениями:

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

Проход по массиву
const n=4; type TGorod = record name: string; chislen:integer; end; TGorodArr = array of TGorod; ...

Проход по массиву
Такой вопрос: у меня есть код, что создаёт массив исходя из указанной размерности, и по этому массиву происходит поиск минимального...

1
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
20.06.2017, 16:36
Нормальный вариант, каждый поток прописывает
свои данные в элементы без дублирования
Кликните здесь для просмотра всего текста

Class ArrayData
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
 
public class ArrayData {
    private int currZero;
    private int currOne;
 
    private List<Integer> linkedList = new LinkedList<Integer>();
    private ArrayList<Result> arrZero;
    private Result resultObject;
 
    public ArrayData() {
        System.out.println("ArrayData.Constructor");
        Random r = new Random();
        for (int j = 0; j < 10; j++) {
            linkedList.add(r.nextInt(100 - 10) + 10);
        }
        arrZero = new ArrayList<Result>();
        for (int t = 0; t < linkedList.size(); t++) {
            arrZero.add(new Result(t));
        }
        currZero = -1;                   //  за пределы 0 начинает с начала
        currOne =  linkedList.size(); // за пределы 1 начинает с конца
    }
 
    public synchronized int getCurrZero() {
        return currZero;
    }
 
    public synchronized int getCurrOne() {
        return currOne;
    }
 
    public synchronized void setCurrZero(int currZero) {
        this.currZero = currZero;
    }
 
    public synchronized void setCurrOne(int currOne) {
        this.currOne = currOne;
    }
 
    public synchronized void setArrZero(int index, Result result) {  // replace
        arrZero.set(index,result);
    }
 
    public synchronized int getLinkedList(int index) {
        return linkedList.get(index);
    }
 
    public synchronized Result getArrZero(int index) {
        return arrZero.get(index);
    }
 
    public synchronized int getSize() {
        return linkedList.size();
    }
 
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                ArrayData arrayData = new ArrayData();
                new Thread(new ArrayRunnable(arrayData,0)).start();
                new Thread(new ArrayRunnable(arrayData,1)).start();
 
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int i = 0; i <  arrayData.getSize() ; i++) {
                    System.out.print(arrayData.getArrZero(i)+" ");
 
                }
                System.out.println();
            }
        }).start();
 
 
    }
}
Class ArrayRunnable
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class ArrayRunnable implements Runnable {
    private ArrayData aData;
    private int dir;
    private int size;
 
    public ArrayRunnable(ArrayData aData, int dir) {
        this.aData = aData;
        this.dir = dir;
        this.size = aData.getSize();
 
    }
 
 
    // блокируется  объект для доступа
    public void checkNumbers(int checkNumber) {     //В зависимости от передаваемого аргумента запускается вычисление единичных или нулевых битов
        if (checkNumber == 0) {                              //Подсчёт кол-ва нулей до последнего единичного бита
            for (int i = 0; i < size; i++) {
                int x = aData.getLinkedList(i);
                Result result = aData.getArrZero(i);
                result.number = Integer.toString(x);
                result.resCount = Integer.toString(size);
                int count = 0;
                while (x != 0) {
                    if ((x & 1) == 0) {
                        count++;
                    }
                    x >>>= 1;
                }
                result.resZero = Integer.toString(count);
                aData.setArrZero(i, result);
                System.out.println(Thread.currentThread().getName() + " 0:" + i);
            }
        } else if (checkNumber == 1) {                       //Подсчёт кол-ва единичных битов
            for (int i = size - 1; i >= 0; i--) {
                int count_2 = 0;
                int x = aData.getLinkedList(i);
                Result result = aData.getArrZero(i);
                while (x != 0) {
                    count_2++;
                    x = x & (x - 1);
                }
                result.resOne = Integer.toString(count_2);
                aData.setArrZero(i, result);
                System.out.println(Thread.currentThread().getName() + " 1:" + i);
            }
        }
    }
 
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " started dir:" + dir);
        checkNumbers(dir);
        System.out.println(Thread.currentThread().getName() + " finished");
    }
}

Альтернативный вариант, каждый поток отрабатывает
только свои элементы
Кликните здесь для просмотра всего текста

Class ArrayData2
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
 
public class ArrayData2 {
    private int currZero;
    private int currOne;
 
    private List<Integer> linkedList = new LinkedList<Integer>();
    private ArrayList<Result> arrZero;
    private Result resultObject;
 
    public ArrayData2() {
        System.out.println("ArrayData.Constructor");
        Random r = new Random();
        for (int j = 0; j < 10; j++) {
            linkedList.add(r.nextInt(100 - 10) + 10);
        }
        arrZero = new ArrayList<Result>();
        for (int t = 0; t < linkedList.size(); t++) {
            arrZero.add(new Result(t));
        }
        currZero = -1;                   //  за пределы 0 начинает с начала
        currOne =  linkedList.size(); // за пределы 1 начинает с конца
    }
 
    public synchronized int getCurrZero() {
        return currZero;
    }
 
    public synchronized int getCurrOne() {
        return currOne;
    }
 
    public synchronized void setCurrZero(int currZero) {
        this.currZero = currZero;
    }
 
    public synchronized void setCurrOne(int currOne) {
        this.currOne = currOne;
    }
 
    public synchronized void setArrZero(int index, Result result) {  // replace
        arrZero.set(index,result);
    }
 
    public synchronized int getLinkedList(int index) {
        return linkedList.get(index);
    }
 
    public synchronized Result getArrZero(int index) {
        return arrZero.get(index);
    }
 
    public synchronized int getSize() {
        return linkedList.size();
    }
 
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                ArrayData2 arrayData = new ArrayData2();
                new Thread(new ArrayRunnable2(arrayData,0)).start();
                new Thread(new ArrayRunnable2(arrayData,1)).start();
 
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int i = 0; i <  arrayData.getSize() ; i++) {
                    System.out.print(arrayData.getArrZero(i)+" ");
 
                }
                System.out.println();
            }
        }).start();
 
 
    }
}
Class ArrayRunnabler2
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class ArrayRunnable2 implements Runnable {
    private ArrayData2 aData;
    private int dir;
    private int size;
 
    public ArrayRunnable2(ArrayData2 aData, int dir) {
        this.aData = aData;
        this.dir = dir;
        this.size = aData.getSize();
 
    }
 
 
    // блокируется  объект для доступа
    public void checkNumbers(int checkNumber) {     //В зависимости от передаваемого аргумента запускается вычисление единичных или нулевых битов
        if (checkNumber == 0) {                              //Подсчёт кол-ва нулей до последнего единичного бита
            for (int i = 0; i < size; i++) {
                if (i >= aData.getCurrOne()) {  // если второй поток обработал все что выше выходим
                    break;
                }
                int x = aData.getLinkedList(i);
                Result result = aData.getArrZero(i);
                result.number = Integer.toString(x);
                result.resCount = Integer.toString(size);
                int count = 0;
                while (x != 0) {
                    if ((x & 1) == 0) {
                        count++;
                    }
                    x >>>= 1;
                }
                result.resZero = Integer.toString(count);
                aData.setArrZero(i, result);
                aData.setCurrZero(i); // прописали себя
                System.out.println(Thread.currentThread().getName() + " 0:" + aData.getCurrZero());
            }
        } else if (checkNumber == 1) {                       //Подсчёт кол-ва единичных битов
            for (int i = size - 1; i >= 0; i--) {
                if (i <= aData.getCurrZero()) {  // если первый поток уже обработал что ниже выходим
                    break;
                }
                int count_2 = 0;
                int x = aData.getLinkedList(i);
                Result result = aData.getArrZero(i);
                while (x != 0) {
                    count_2++;
                    x = x & (x - 1);
                }
                result.resOne = Integer.toString(count_2);
                aData.setArrZero(i, result);
                aData.setCurrOne(i); // прописали себя
                System.out.println(Thread.currentThread().getName() + " 1:" + aData.getCurrOne());
            }
        }
    }
 
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " started dir:" + dir);
        checkNumbers(dir);
        System.out.println(Thread.currentThread().getName() + " finished");
    }
}

Смотрите код. Полагаю Вам нужен первый вариант.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.06.2017, 16:36
Помогаю со студенческими работами здесь

проход по многомерному массиву
Есть двухмерный массив $mass = 1; $mass = 1; $mass = 1; $mass = 1; $mass = 1; $mass = 1; $mass = 0;

Проход for по массиву fetch_array
В таблице 10 ячеек для url картинок Можно ли пройтись циклом каким-либо образом и удалить переменную если там пусто? Думал...

Проход по массиву с изменением элементов
Здравствуйте, надо пройтись по массиву и преобразовать его элементы. Я написал что-то такое, но оно не работает :pardon: , в haskell я...

Проход по массиву другим массивом
Уважаемые знатоки, вопрос следующий: как реализовать проход по массиву другим массивом? Суть такова, есть большой двумерный массив...

Проход по ассоциативному массиву ассоциативных массивов
Описал такую структуру: Nodes={chNode1: , chNode2: , .., chNodeN: }; .. Nodes={chNode1: , chNode2: , .., chNodeN: }; Пример...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru