Grouping Data by Service ID in Java

 avatar
unknown
java
16 days ago
4.0 kB
2
Indexable
import java.util.*;

public class Main {
    public static void main(String[] args) {
        // Verilerinizi ekliyoruz
        List<Map<String, String>> data = new ArrayList<>();
        data.add(createData(43, "CHANNEL", "WEB"));
        data.add(createData(43, "CHANNEL", "WS"));
        data.add(createData(43, "TYPE", "HASAR"));
        data.add(createData(43, "TYPE", "PLAKA"));
        data.add(createData(43, "PKG", "IKI"));
        data.add(createData(43, "PKG", "BIR"));
        data.add(createData(44, "OPT", "TT"));
        data.add(createData(45, "OP", "VDF"));
        data.add(createData(45, "OP", "TC"));

        // serviceId'ye göre gruplayacağız
        Map<Integer, Map<String, List<String>>> groupedData = new HashMap<>();

        // Veriyi gruplayalım: serviceId -> code -> val listesi
        for (Map<String, String> entry : data) {
            Integer serviceId = Integer.parseInt(entry.get("serviceId"));
            String code = entry.get("code");
            String val = entry.get("val");

            groupedData
                .computeIfAbsent(serviceId, k -> new HashMap<>())
                .computeIfAbsent(code, k -> new ArrayList<>())
                .add(val);
        }

        // Şimdi her serviceId için kombinasyonları bulacağız
        for (Map.Entry<Integer, Map<String, List<String>>> entry : groupedData.entrySet()) {
            Integer serviceId = entry.getKey();
            Map<String, List<String>> codeMap = entry.getValue();

            // Kodlar için kombinasyonları bulalım
            List<List<String>> allCombinations = new ArrayList<>();
            getCombinations(new ArrayList<>(codeMap.values()), 0, new ArrayList<>(), allCombinations);

            // Sonuçları yazdıralım
            for (List<String> combination : allCombinations) {
                String combinedText = buildText(combination, codeMap);
                System.out.println(serviceId + "," + combinedText);
            }
        }
    }

    // Kombinasyonları oluşturmak için yardımcı metot
    private static void getCombinations(List<List<String>> lists, int index, List<String> current, List<List<String>> allCombinations) {
        if (index == lists.size()) {
            allCombinations.add(new ArrayList<>(current));
            return;
        }

        List<String> currentList = lists.get(index);
        for (String value : currentList) {
            current.add(value);
            getCombinations(lists, index + 1, current, allCombinations);
            current.remove(current.size() - 1);
        }
    }

    // Kombinasyonları birleştirip doğru formatta dönen metot, burada alfabetik sıralama ekledik
    private static String buildText(List<String> combination, Map<String, List<String>> codeMap) {
        List<String> parts = new ArrayList<>();
        
        // code'ları alfabetik olarak sıralıyoruz
        List<String> sortedCodes = new ArrayList<>(codeMap.keySet());
        Collections.sort(sortedCodes);
        
        // Kod sırasına göre val'leri doğru sırayla eşleştiriyoruz
        Iterator<String> codeIterator = sortedCodes.iterator();
        
        // Kod sırasına göre val'leri eşleştiriyoruz
        for (String code : sortedCodes) {
            List<String> values = codeMap.get(code);
            // values'ı sırasıyla almak için combination'daki elemanları kullanacağız
            String value = combination.get(sortedCodes.indexOf(code));
            parts.add(code + ":" + value);
        }

        return String.join("|", parts);
    }

    // Yardımcı metot: Data nesnesi oluşturmak için
    private static Map<String, String> createData(int serviceId, String code, String val) {
        Map<String, String> map = new HashMap<>();
        map.put("serviceId", String.valueOf(serviceId));
        map.put("code", code);
        map.put("val", val);
        return map;
    }
}
Leave a Comment