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

Можно ли передавать условие сортировки массива

03.03.2016, 00:04. Показов 2069. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем времечка суток! Порылся-порылся в разных всяких источниках и понял, что лучше взять "помощь друга". То ли запросы не правильно формулировал, то ли просто не повезло, но я так и не понял можно ли передать в параметры IF разные условия, или нужно каждый раз писать сортировку заново для разных условий? Собственно вот код:
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
import java.util.Scanner;
 
public class MyCollection {
 
    int numberSchool;
    String namePupil;
    String soNamePupil;
    long phoneNumber;
 
    public MyCollection(int school, String name, String soName, long phone) {
        this.numberSchool = school;
        this.namePupil = name;
        this.soNamePupil = soName;
        this.phoneNumber = phone;
    }
 
    public MyCollection add() {
        int school = new Scanner(System.in).nextInt();
        String name = new Scanner(System.in, "CP1251").nextLine();
        String soName = new Scanner(System.in, "CP1251").nextLine();
        long phone = new Scanner(System.in).nextLong();
        return new MyCollection(school, name, soName, phone);
    }
 
    public static MyCollection[] addingCollection() {
        int n = 4;
        MyCollection added = new MyCollection(0, null, null, 0);
        MyCollection[] myC = new MyCollection[n];
        for (int i = 0; i < myC.length; i++) {
            myC[i] = added.add();
        }
        return myC;
    }
 
    public static void sortedBySchool(MyCollection[] myC) {
        for (int i = 0; i < myC.length; i++) {
            for (int j = 0; j < myC.length - i - 1; j++) {
//                if (myC[j].numberSchool > myC[j + 1].numberSchool) { //сортировка по номеру школы
//                if (myC[j].phoneNumber > myC[j + 1].phoneNumber) { //сортировка по номеру телефона
                if (myC[j].soNamePupil.compareTo(myC[j + 1].soNamePupil) > 0) { //сортировка по фамилии
                    MyCollection temp = myC[j];
                    myC[j] = myC[j + 1];
                    myC[j + 1] = temp;
                }
            }
        }
        for (MyCollection print : myC) {
            System.out.println(print.toString());
        }
    }
 
    public static void main(String[] args) {
        sortedBySchool(addingCollection());
    }
 
    @Override
    public String toString() {
        return "школа № " + numberSchool + " " + namePupil + " " + soNamePupil + " тел.: " + phoneNumber;
    }
}
Строки 38 и 39 закомментированы - вот эти то параметры и хотелось бы передавать при выборе в меню сортировки. Возможно такое и, если да, то как реализуется? Или проще написать три разных метода и не заморачиваться?
Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2016, 00:04
Ответы с готовыми решениями:

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

Разработать приложение, в котором можно выбирать различные методы сортировки для упорядочивания элементов массива
Помогите пожалуйста с приложением. unit Unit7; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

2 массива. Установите, можно ли в первом массиве из них выбрать такие К подряд идущих элементов чтобы выполнялись условие
Даны два числа N, K (K&lt;N) и два целочисленных массива X(N), Y(K). Установите, можно ли в первом из них выбрать такие К подряд идущих...

8
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
03.03.2016, 00:15
HOBATOP, если я правильно понял, нужно что-то наподобие этого + к примеру Arrays.sort()
Попробуйте сами разобраться, если возникнут вопросы - спрашивайте.
0
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
03.03.2016, 00:27  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
нужно что-то наподобие
не, это не совсем в точку. Смотрите: код метода сортировки абсолютно идентичен различие лишь в одной строке. Так вот и интересно можно ли передать в if (вот сюда конкретно) различные параметры по выбору. Или это неразрешимо и лучше написать несколько различных методов (сортировка по школе, фамилии, телефону и тд.)?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
03.03.2016, 01:00
Лучший ответ Сообщение было отмечено HOBATOP как решение

Решение

Цитата Сообщение от HOBATOP Посмотреть сообщение
Так вот и интересно можно ли передать в if (вот сюда конкретно) различные параметры по выбору
Объект с интерфейсом Comparator как раз туда и передается
Цитата Сообщение от HOBATOP Посмотреть сообщение
код метода сортировки абсолютно идентичен различие лишь в одной строке
в этом случае он будет идентичен всегда
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void sort(MyCollection[] myC, Comparator<MyCollectopn> cmp) {
        for (int i = 0; i < myC.length; i++) {
            for (int j = 0; j < myC.length - i - 1; j++) {
                if (cmp.compare(myC[j], myC[j+1]) > 0) { //сортировка по любому условию из cmp
                    MyCollection temp = myC[j];
                    myC[j] = myC[j + 1];
                    myC[j + 1] = temp;
                }
            }
        }
        for (MyCollection print : myC) {
            System.out.println(print.toString());
        }


------------------------------------------------
Вот, покопался в лямбдах, можно примерно так еще сделать
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void sortedBySchool(MyCollection[] myC, BiPredicate<MyCollection, MyCollection> c) {
        for (int i = 0; i < myC.length; i++) {
            for (int j = 0; j < myC.length - i - 1; j++) {
                if (c.test(myC[j], myC[j+1])) { 
                    MyCollection temp = myC[j];
                    myC[j] = myC[j + 1];
                    myC[j + 1] = temp;
                }
            }
        }
        for (MyCollection print : myC) {
            System.out.println(print.toString());
        }
    }
 
    public static void main(String[] args) {
        sortedBySchool(addingCollection(), (first, second) -> (first.phoneNumber > second.phoneNumber));//сортировка по номеру
    }
1
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
03.03.2016, 14:31  [ТС]
КОП, а у меня чего-то не увязывались в один пучок простой массив и Comparator, отчего-то полагал, что это прерогатива коллекций. Спасибо, ещё не до конца разобрался, но уже вижу - именно то, что нужно и, судя по всему, довольно удобно.

Добавлено через 3 часа 18 минут
Нормуль получилось, есть меню выбора по какому параметру сортировать работает вполне себе прилично, единственно что недопонял: куда приткнуть обработку исключения (throw new UnsupportedOperationException("Not supported yet.") или им придётся пожертвовать ради возможности иметь выбор?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
03.03.2016, 14:50
Цитата Сообщение от HOBATOP Посмотреть сообщение
куда приткнуть обработку исключения (throw new UnsupportedOperationException("Not supported yet.")
а код покажите, где выкидывает. Если в общем, то пробрасывать до тех пор, пока не дойдете до метода, который знает, как его обработать.
0
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
03.03.2016, 15:30  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
где выкидывает
Так ни где не выкидывает, при переопределении
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        @Override
        public int compare(MyControl o1, MyControl o2) {
            int n = 0;
            if (menu == 1) {
                n = compareS(o1, o2);
            }
            if (menu == 2) {
                n = compareN(o1, o2);
            }
            if (menu == 3) {
                n = compareSoName(o1, o2);
            }
            if (menu == 4) {
                n = compareP(o1, o2);
            }
            return n;
//            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
пришлось его закомментить. Но всё работает здорово, не вываливается. Единственно, пожалуй, нужно определить когда ошибочный ввод (не 1 - 4, а 8 там или 5) случился, что делать программе. Сейчас ни чего не происходит, вывод без сортировки и всё. Ну это мелочи.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
03.03.2016, 15:49
Цитата Сообщение от HOBATOP Посмотреть сообщение
Так ни где не выкидывает, при переопределении
А, понял о чем вы. Если ваш компаратор по каким либо причинам не может сравнить 2 объекта(переопределить метод), но при этом реализует интерфейс, тогда бросается это исключение. Т.е. как только метод реализован, то бросать ничего не надо. Пример с кондеем

Если можно, еще одно небольшое замечание: очень сильно сбивают названия классов и методов.
MyCollection сам является по сути элементом коллекции т.е. CollectionElement или Pupil
addingCollection() -> createCollection(int n);
add() должен только добавлять элемент, а не запрашивать кучу данных или назвать его createPupil()
ну очень мозги выносит)
0
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
03.03.2016, 18:02  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
очень сильно сбивают названия классов и методов
Да я уже и сам понял, что нужно было бы как-то иначе их обозвать, но оно потянулось от одной давнишней затеи и так и тянется. Надо бы переименовать, реально путает... Но это же совсем ещё даже не заготовка, а набросок, мазня... Сумбурные мысли вот такое и порождают, да и опыта практического не хватает, если уж совсем на чистоту.

Добавлено через 1 час 26 минут
Итак, уже чего-то вырисовывается. Что желательно ещё подправить вот в этой х... орошей вещи?
Кликните здесь для просмотра всего текста
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
85
86
87
88
89
90
91
92
93
94
95
96
public class Pupil {
 
    int numberSchool;
    static int select;
    String namePupil;
    String surnamePupil;
    long phoneNumber;
 
    public Pupil(int school, String name, String surname, long phone) {
        this.numberSchool = school;
        this.namePupil = name;
        this.surnamePupil = surname;
        this.phoneNumber = phone;
    }
 
    public Pupil keyboardInput() {
        System.out.print("Номер школы: ");
        int school = new Scanner(System.in).nextInt();
        System.out.print("Имя учащегося: ");
        String name = new Scanner(System.in, "CP1251").nextLine();
        System.out.print("Фамилия учащегося: ");
        String soName = new Scanner(System.in, "CP1251").nextLine();
        System.out.print("Телефон: ");
        long phone = new Scanner(System.in).nextLong();
        return new Pupil(school, name, soName, phone);
    }
 
    public static Pupil[] addElement() {
        int n = 3;
        Pupil added = new Pupil(0, null, null, 0);
        Pupil[] persone = new Pupil[n];
        for (int i = 0; i < persone.length; i++) {
            persone[i] = added.keyboardInput();
        }
        return persone;
    }
 
    public static int menuSort() {
        System.out.print("Меню сортировки:\n1 - сортировать по номеру школы"
                + "\n2 - сортировать по имени\n3 - сортировать по фамилии"
                + "\n4 - сортировать по номеру телефона\nОжидается выбор: ");
        return new Scanner(System.in).nextInt();
    }
 
    static Comparator<Pupil> cmp = new Comparator<Pupil>() {
 
        public int schoolCompare(Pupil o1, Pupil o2) {
            return (o1.numberSchool == o2.numberSchool) ? 0 : (o1.numberSchool > o2.numberSchool) ? 1 : -1;
        }
 
        public int phoneCompare(Pupil o1, Pupil o2) {
            return (o1.phoneNumber == o2.phoneNumber) ? 0 : (o1.phoneNumber > o2.phoneNumber) ? 1 : -1;
        }
 
        public int nameCompare(Pupil o1, Pupil o2) {
            return o1.namePupil.compareTo(o2.namePupil);
        }
 
        public int surnameCompare(Pupil o1, Pupil o2) {
            return o1.surnamePupil.compareTo(o2.surnamePupil
            );
        }
 
        @Override
        public int compare(Pupil o1, Pupil o2) {
            Object[] array = {schoolCompare(o1, o2), nameCompare(o1, o2), surnameCompare(o1, o2), phoneCompare(o1, o2)};
            return (int) array[select - 1];
        }
    };
 
    public static void sortElements(Pupil[] pupil, Comparator<Pupil> cmp) {
        select = menuSort();
        for (int i = 0; i < pupil.length; i++) {
            for (int j = 0; j < pupil.length - i - 1; j++) {
                if (cmp.compare(pupil[j], pupil[j + 1]) > 0) {
                    Pupil temp = pupil[j];
                    pupil[j] = pupil[j + 1];
                    pupil[j + 1] = temp;
                }
            }
        }
 
        for (Pupil output : pupil) {
            System.out.println(output.toString());
        }
    }
 
    public static void main(String[] args) {
        sortElements(addElement(), cmp);
    }
 
    @Override
    public String toString() {
        return "школа № " + numberSchool + " " + namePupil + " " + surnamePupil + " тел.: " + phoneNumber;
    }
}

Конечно да, я полагаю нужно бы использовать BufferedReader вместо сканера, try/catch поокружать (крашится эта штуковина просто на раз), но это всё функциональности не добавляет, хотя и желательно. А вот из реально полезного чего сделать можно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.03.2016, 18:02
Помогаю со студенческими работами здесь

Можно ли процедуре передавать множество?
Пытаюсь сделать так: 1 type 2 setx=set of byte; 3 procedure addset(a:setx; b:integer); 4 var 5 ...

Можно ли так передавать context?
Не приведет ли это к утечке памяти? public class A{ public static void fileRead(Context context){ FileOutputStream...

Можно ли передавать событие по ссылке
Вопрос скорей риторический. У меня не заработала такая схема: class A { private Action MyDelegate; private Timer...

Можно ли массив передавать как параметр?
Всем доброго дня! Короче, есть несеолько массивов, скажем два; - arrb и arrc. И есть функция типа int count();. Надо чтобы эта функция...

Написать программу сортировки массива с помощью алгоритма внешней сортировки
1. Дан текстовый файл, в котором записана последовательность целых чисел. Написать программу сортировки массива с помощью алгоритма внешней...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru