Как получить сгруппированные значения, передав в качестве ключа, который получает от минимального значения в списке - PullRequest
0 голосов
/ 16 апреля 2020
private String a1, a2, a3, a4;
private String b1, b2, b3, b4;
private int c1, c2, c3, c4;

Здравствуйте, друзья! В приведенном выше коде я хочу сгруппировать (a1, b1, c1), (a2, b2, c2) et c ... и для оставшегося значения. (как группировать? 1-й вопрос)

А потом я создал список, в котором хранятся значения {c1, c2, c3, c4}

Integer[] arr1 = {c1, c2, c3, c4};
private ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(arr1));

И затем я хочу получить минимальное значение из list1, и я хочу получить другие два значения и сохранить его в другом списке2 (например, минимальное значение c3, я хочу получить a3 и b3 и сделать так, чтобы оно комбинировалось как a3 + b3, и я хочу сохранить это в list2. И затем я хочу удалить это значение c3 из списка, и снова я хочу получить минимальное значение из list1, и вышеупомянутая та же самая операция должна быть выполнена, пока список list1 не станет пустым.

Я пытался использовать Dictionery , но c1, c2, c3, c4 у него есть повторяющиеся значения. поэтому оба значения я также не могу принять. Поэтому нужно лучшее решение для моей проблемы. U также может дать мне любые альтернативные решения, также друзья.

Заранее спасибо.

1 Ответ

0 голосов
/ 17 апреля 2020

Перво-наперво, это простое для понимания решение, имеющее O (n ^ 2) временную сложность. Если вам нужно иметь дело со множеством списков, я могу предложить другое решение, используя TreeSet и Comparator. Также еще два пункта:

  1. Вы должны добавить c и список1, список2 и т. Д. c в том порядке, в котором они соответствуют друг другу. Например, если c1 должен быть связан со list1, когда вы добавляете c1 в список myValues, вы должны добавить list1 в myLists.
  2. У вас должно быть одинаковое количество c и списков, которые они связывают с , Например, если у вас есть c1, c2, c3, у вас есть list1, list2, list3 или же будет сгенерировано IndexOutOfBoundsException. С учетом сказанного здесь ваш код.

    //create a list that will hold all the lists of the a,b
    LinkedList<Integer> myValues = new LinkedList<>();
    
    int c1 = 1, c2 = 6, c3 = 2;
    
    myValues.add(c1);
    myValues.add(c2);
    myValues.add(c3);
    
    LinkedList<LinkedList<String>> myLists = new LinkedList<>();
    
    LinkedList<String> list1 = new LinkedList<>();
    LinkedList<String> list2 = new LinkedList<>();
    LinkedList<String> list3 = new LinkedList<>();
    
    myLists.add(list1);
    myLists.add(list2);
    myLists.add(list3);
    
    
    String a1 = "a1",b1 = "b1",a2 = "a2",b2 = "b2",a3 = "a3",b3 = "b3";
    
    list1.add(a1);
    list1.add(b1);
    list2.add(a2);
    list2.add(b2);
    list3.add(a3);
    list3.add(b3);
    
    myLists.forEach((b) -> b.forEach((s) -> System.out.println(s)));
    
    //sort the list
    int arrLength = myValues.size();
    for (int i = 0; i < arrLength - 1; i++) {
        for (int j = 0; j < arrLength - i - 1; j++)
        if (myValues.get(j) > myValues.get(j + 1)) {
    
        //when you sort the c's you sorth the lists as well
        // swap
        int temp = myValues.get(j);
        myValues.set(j, myValues.get(j + 1));
        myValues.set(j + 1, temp);
    
        LinkedList<String> tempList = myLists.get(j);
        myLists.set(j, myLists.get(j + 1));
        myLists.set(j + 1, tempList);
        }
    }
    
    System.out.println("after sorting");
    myLists.forEach((b) -> b.forEach((s) -> System.out.println(s)));
    
    
    while(!myValues.isEmpty()) {
        int myC = myValues.pop();
        LinkedList<String> myList = myLists.pop();
    
        //do your thing
    }
    

Вы можете добавить приведенный выше код в пустой основной метод, запустить его и посмотреть, как он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...