Search code examples
javasortingjava-8maxby

How to sort an objects list based on the attribute in the lists


I have an list of objects like Notification that has 3 lists - areaWise, sensorWise and regionWise. I need to sort the Notification object list based on the max percentage by combining all 3 lists.

Below is my notification object :

{
                "notificationId": 26,
                "areaWise": [],
                "sensorWise": [
                    {
                        "id": 3,
                        "threshold": 1,
                        "headCount": 113,
                        "pecentage": 11200
                    },
                    {
                        "id": 4,
                        "threshold": 1,
                        "headCount": 108,
                        "pecentage": 10700
                    },
                    {
                        "id": 5,
                        "threshold": 1,
                        "headCount": 108,
                        "pecentage": 10700
                    },
                    {
                        "id": 7,
                        "threshold": 1,
                        "headCount": 91,
                        "pecentage": 9000
                    }
                ],
                "regionWise": []
            },

Solution

  • @Data
    public class Item {
    
        private int notificationId;
        private List<Wise> areaWise;
        private List<Wise> sensorWise;
        private List<Wise> regionWise;
    
        @Data
        public static class Wise {
            private int id;
            private int threshold;
            private int headCount;
            private int pecentage;
        }
    }
    
    class Test {
        static void main() {
            ArrayList<Item> items = new ArrayList<>(10);
    
            items.sort(Comparator.comparingInt(
                    item ->
                        Stream.of(item.getAreaWise(), item.getSensorWise(), item.getRegionWise())
                                .flatMapToInt(wises -> wises.stream().mapToInt(Item.Wise::getPecentage))
                    .max().orElse(Integer.MIN_VALUE)
            ));
        }
    }