порядок от самого высокого до самого низкого и изменения позиции из другого массива java

у меня есть два массива.,

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

Например:

Массив строк: [Регистрация и глава администрации, веб-дизайн, ИТ — инженер-программист, бухгалтер, инженер по сетям] Массив целых чисел: [4, 2, 2, 6, 2]

Но мне нужен результат сверху.,

Массив строк: [Бухгалтер, регистратор и глава администрации, ИТ-инженер-программист, сетевой инженер, веб-дизайн] Массив целых чисел: [6, 4, 2, 2, 2]

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

есть ли кратчайший путь?


person Krishna Veni    schedule 01.07.2016    source источник
comment
Самый разумный способ - изменить этот 2 ArrayList на 1 ArrayList объектов, где класс будет иметь 2 поля: имя строки и значение int. Также в этом классе реализован интерфейс Comparable на основе значения. И тогда это будет просто использование Collections.sort()   -  person Mateusz Pryczkowski    schedule 01.07.2016


Ответы (5)


Я надеюсь, что это поможет вам:

int[] intArray = new int[] { 4, 2, 2, 6, 2 };
String[] strArray = new String[] { "Register & Head of Administration", "Web Designing", "IT - Software Engineer", "Accountant", "Network Engineer" };
int tmp0 = 0;
String tmp1 = "";
for (int i = 0; i < intArray.length; i++) {

    for (int j = i + 1; j < intArray.length; j++) {

        if (intArray[j] > intArray[i]) {

            // swap in int-Array
            tmp0 = intArray[i];
            intArray[i] = intArray[j];
            intArray[j] = tmp0;

            // swap in string-Array
            tmp1 = strArray[i];
            strArray[i] = strArray[j];
            strArray[j] = tmp1;
        } else if (intArray[j] == intArray[i]) {

            // sorts alphabetically
            if (strArray[j].compareTo(strArray[i]) < 0) {

                tmp1 = strArray[i];
                strArray[i] = strArray[j];
                strArray[j] = tmp1;
            }
        }
    }
}

//output
for (int k = 0; k < intArray.length; k++) {

    System.out.println(strArray[k] + " " + intArray[k]);
}

Выход:

Accountant 6 Register & Head of Administration 4 IT - Software Engineer 2 NetworkEngineer 2 Web Designing 2

person RNGsus Cryst    schedule 01.07.2016

Почему бы не использовать третий класс, который группирует все строки с весом.

Создайте компаратор для заказа WeightString, затем используйте Stream API для использования данных.

public class WeightString {
    public String value;
    public int weight;

    public WeightString(String value, int weight) {
        this.value = value;
        this.weight = weight;
    }
}

public Comparator<WeightString> mWeightStringComparator = 
        (o1, o2) -> Integer.compare(o1.weight, o2.weight);


// in code
WeightString[] weightStrings = new WeightString[]{
        new WeightString("a", 12),
        new WeightString("b", 1),
        new WeightString("c", 8),
        new WeightString("d", 4)
};

Stream<WeightString> stringStream = Arrays.stream(weightStrings);
stringStream.sorted(mWeightStringComparator);
WeightString[] orderedWeightStrings = (WeightString[]) stringStream.toArray();

//orderedWeightStrings : [b,d,c,a]
person Lionel Briand    schedule 01.07.2016

В вашем случае небольшой размер массива означает использование пузырьковой сортировки (пузырьковая сортировка не является высокой производительностью для большого массива). Сортировка массива int на основе позиции, в которой вы меняете строковый массив, также как это

            int intArray[] = new int[]{4, 2, 2, 6, 2};
            String strArray[]=new String[]{Accountant, Register & Head of Administration, IT - Software Engineer, Network Engineer,Web Designing}
            int n = intArray.length;
            int temp = 0,temp1=0;               
            for(int i=0; i < n; i++){
                    for(int j=1; j < (n-i); j++){                               
                            if(intArray[j-1] < intArray[j]){                                        
                                    temp = intArray[j-1];
                                    temp1=strArray[j-1];
                                    intArray[j-1] = intArray[j];
                                    strArray[j-1] = strArray[j];
                                    intArray[j] = temp;
                                    strArray[j] = temp1;
                            }                               
                    }
            }
person sasikumar    schedule 01.07.2016
comment
это будет работать, но: 1. вы не знаете количество элементов в массивах, поэтому пузырьковая сортировка может быть не лучшей, 2-й - зачем писать так много кода, когда все можно сделать лучше - person Mateusz Pryczkowski; 01.07.2016
comment
В вашем случае небольшой размер массива означает использование пузырьковой сортировки (пузырьковая сортировка не является высокой производительностью для большого массива) - person sasikumar; 01.07.2016

Попробуйте что-нибудь вроде этого

Это будет структура ваших данных

class DataModel{
  int priority;
  String priorityName;
  DataModel(int priority,String priorityName){
       this.priority = priority; 
       this.priorityName = priorityName;
   }
}

Теперь создайте Arraylist этого класса dataArrayList<DataModel>

Используйте метод для сортировки вашего массива int с приоритетами

for(int i=0; i < n; i++){
   for(int j=1; j < (n-i); j++){

            if(intArray[j-1] < intArray[j]){

             //add the data of your largest int number in your int Array and use its position to get the data of your String array. 
             dataArrayList.add(new DataModel(your_lagest_int, your_department)); 

        }
    }
}

Вы должны получить отсортированный массив со всеми вашими данными.

person Siddhesh Dighe    schedule 01.07.2016

person    schedule
comment
Не уверен, если вы заметили, но есть повторяющиеся значения (поэтому в вашем случае дублируются ключи, поэтому они не будут работать) - person Mateusz Pryczkowski; 01.07.2016