Получить значение атрибута из базы данных sql как пользовательский объект в hashmap - PullRequest
2 голосов
/ 04 мая 2020
public class Dashboard {
   int REQUEST_ID, PRICE, PROCESSED;           
   String LOGIN_USER;

public int getREQUEST_ID() {
   return REQUEST_ID;
}

public void setREQUEST_ID(int rEQUEST_ID) {
   REQUEST_ID = rEQUEST_ID;
}

//all getters and setters
public class DBConnection {
   public ArrayList<Dashboard>  getStoreResult() {
      ArrayList<Dashboard> dashRec;

   try{
      Class.forName("");
      Connection con=DriverManager.getConnection("");
      Statement st=con.createStatement();
      ResultSet rs=st.executeQuery("");

      HashMap<Object, List<Dashboard>> map = new HashMap<>();
      while (rs.next()) {
        Integer id = rs.getInt(1);
        if (!map.containsKey(id)) {
            dashRec= new ArrayList<Dashboard>();
            map.put(id, dashRec);
        }
        Dashboard dash = new Dashboard();
        dash.setREQUEST_ID(id);
        dash.setLOGIN_USER(rs.getString(2));
        dash.setPRICE(rs.getInt(3));
        dash.setPROCESSED(rs.getInt(4));
        map.get(id).add(dash);
      }
   }
  }
}

Я хочу добавить имя и статус как определенный пользователем объект в приведенной выше хэш-карте. Имя должно быть похоже на A для первых 3 наборов, B для следующих 2 наборов строк . Статус, который я хочу вставить, должен быть наименьшим номером в наборе строк с одинаковым идентификатором. То есть с идентификатором 123 нам нужен статус 1 для вставки в качестве объекта в hashmap, а для идентификатора 456 нам нужен статус 2. Как это будет сделано?

SQL DB

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Если я ясно понял ваше требование, вы хотите отсортировать Map в порядке возрастания requestId, а затем отсортировать список Dashboard записей с тем же requestId в порядке возрастания status , Если да, то ниже приведено решение для того же:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

class Dashboard {
    private int requestId, price, processed;
    String loginUser;

    public Dashboard(int requestId, String loginUser, int price, int processed) {
        this.requestId = requestId;
        this.price = price;
        this.processed = processed;
        this.loginUser = loginUser;
    }

    public int getRequestId() {
        return requestId;
    }

    public int getPrice() {
        return price;
    }

    public int getProcessed() {
        return processed;
    }

    public String getLoginUser() {
        return loginUser;
    }

    @Override
    public String toString() {
        return requestId + "\t" + price + "\t" + processed + "\t" + loginUser;
    }
}

public class Main {
    public static void main(String[] args) {
        Map<Object, List<Dashboard>> map = new TreeMap<>();
        List<Dashboard> list;

        list = new ArrayList<Dashboard>();
        list.add(new Dashboard(456, "B", 25, 2));
        list.add(new Dashboard(456, "B", 20, 3));
        map.put(456, list);

        list = new ArrayList<Dashboard>();
        list.add(new Dashboard(123, "A", 10, 2));
        list.add(new Dashboard(123, "A", 15, 3));
        list.add(new Dashboard(123, "A", 5, 1));
        map.put(123, list);

        list = new ArrayList<Dashboard>();
        list.add(new Dashboard(789, "C", 30, 1));
        map.put(789, list);

        // Sort the list of Dashboard records with the same requestId in ascending order
        // of status
        for (Entry<Object, List<Dashboard>> entry : map.entrySet()) {
            Collections.sort(entry.getValue(), Comparator.comparing(Dashboard::getProcessed));
        }

        // Display Result
        System.out.println("reqid\tname\tprice\tstatus");
        for (List<Dashboard> recordList : map.values()) {
            for (Dashboard record : recordList) {
                System.out.println(record.getRequestId() + "\t" + record.getLoginUser() + "\t" + record.getPrice()
                        + "\t" + record.getProcessed());
            }
        }
    }
}

Выход:

reqid   name    price   status
123     A       5       1
123     A       10      2
123     A       15      3
456     B       25      2
456     B       20      3
789     C       30      1

Примечания:

  1. Я использовал TreeMap , который отсортирован в соответствии с естественным порядком его ключей. Поскольку ключи int requestId, нам не нужно ничего делать для их сравнения. TreeSet автоматически позаботится о сохранении их в порядке возрастания.
  2. Чтобы отсортировать список Dashboard записей с одинаковыми requestId в порядке возрастания status, я получил список Dashboard записывает, используя requestId в качестве ключа, а затем сортирует List, используя Comparator.comparing(Dashboard::getProcessed).
0 голосов
/ 08 мая 2020

Вы можете l oop по карте после того, как while-l oop вот так

проверить размер списка 3, 2 или 1

На основе вашего почтового запроса Есть 3, 2 и 1 строки, и я хочу

статус от 1 до 3, когда строки 3 статуса от 2 до 3, когда строки 2 статуса 1, когда 1 строка

на основе этого Я пишу условие для проверки:

список размеров: 3 -> (3-3) +1 = 2

список размеров: 2 -> (3-2) +1 = 2

список размера: 1 -> (3-1) +1 = 3

AtomicInteger

Поскольку я l oop над Dashboard list с использованием Stream в Foreach и если вы хотите получить доступ к любым переменным вне этого метода, пометьте как окончательный. Поэтому я добавил объект AtomicInteger

больше информации Atomi c Целое число Oracle

        // create another map contains the lowest status for each id
        Map<Integer, Integer> lowestStatus = new HashMap<>();
        for (Integer key : map.keySet()) {

            // get the size of the list related to that id
            int size = map.get(key).size();
            int status = (3 - size) + 1;
            final AtomicInteger statusCounter = new AtomicInteger(status);

            if (status != 3) {
                map.get(key).forEach(dashboard -> {
                    if (!lowestStatus.containsKey(key))
                        lowestStatus.put(key, statusCounter.get());

                    dashboard.setStatus(statusCounter.getAndIncrement());
                });

            } else {
                Dashboard dashboard = map.get(key).get(0);
                dashboard.setStatus(1);
                lowestStatus.put(key, 1);
            }
        }

, еще одна версия

CurrentStatus

Чтобы отслеживать последнее состояние при наличии этого идентификатора

LowestStatus

Сохранить первое вхождение в заданном наборе строки с данным идентификатором примут 1 значение

        Map<Integer, List<Dashboard>> map = new HashMap<>();
        Map<Integer, Integer> lowestStatus = new HashMap<>();
        Map<Integer, Integer> currentStatus = new HashMap<>();

        while (rs.next()) {
            Integer id = rs.getInt(1);
            if (!map.containsKey(id)) {
                map.put(id, new ArrayList<Dashboard>());
                currentStatus.put(id, 0);
                lowestStatus.put(id, 1);
            }
            Dashboard dash = new Dashboard();
            dash.setRequestId(id);
            dash.setLoginUser(rs.getString(2));
            dash.setPrice(rs.getInt(3));
            dash.setProcessed(rs.getInt(4));
            dash.setStatus(currentStatus.get(id) + 1);
            currentStatus.put(id, currentStatus.get(id) + 1); // update the status for the next iteration
            map.get(id).add(dash);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...