কোনও অ্যাট্রিবিউট দ্বারা অবজেক্টের একটি তালিকা গ্রুপ করুন


102

আমাকে নির্দিষ্ট অবজেক্টের Studentএকটি অ্যাট্রিবিউট ( Location) ব্যবহার করে অবজেক্টের ( ) তালিকা তৈরি করতে হবে । কোডটি নীচের মতো:

public class Grouping {
    public static void main(String[] args) {

        List<Student> studlist = new ArrayList<Student>();
        studlist.add(new Student("1726", "John", "New York"));
        studlist.add(new Student("4321", "Max", "California"));
        studlist.add(new Student("2234", "Andrew", "Los Angeles"));
        studlist.add(new Student("5223", "Michael", "New York"));
        studlist.add(new Student("7765", "Sam", "California"));
        studlist.add(new Student("3442", "Mark", "New York"));

    }
}

class Student {
    String stud_id;
    String stud_name;
    String stud_location;

    Student(String sid, String sname, String slocation) {
        this.stud_id = sid;
        this.stud_name = sname;
        this.stud_location = slocation;
    }
}

দয়া করে আমাকে এটি করার একটি পরিষ্কার উপায় প্রস্তাব করুন।


4
কী হিসাবে লোকেশন এবং শিক্ষার্থীদের মান হিসাবে তালিকা সহ একটি হ্যাশম্যাপ।
ওমোরো

অবস্থান অনুসারে বাছাই করা আপনার সমস্যার সমাধান করতে পারে, বা অন্য কিছু আছে?
ওয়ার্লর্ড

তুলনামূলক ব্যবহার করে চেষ্টা করুন এবং অবস্থান অনুসারে বাছাই করুন।
pshemek

4
@ ওয়ার্লর্ড হ্যাঁ, তবে আরও তথ্যের মতো আমার যদি তথ্যের দরকার হয় তবে অবস্থানের দ্বারা শিক্ষার্থীদের গণনা আরও ভাল করে যদি আমি এটির
গোষ্ঠীভূত

@ ওমোরো দয়া করে আপনি আমাকে কোড দিয়ে একটি সূত্র দিতে পারেন, আমি হাশম্যাপসের সাথে এতটা পরিচিত নই
দিলুকশন মহেন্দ্র

উত্তর:


132

এই ছাত্রদের বস্তুর যোগ হবে HashMapসঙ্গে locationIDকী-এর মত।

HashMap<Integer, List<Student>> hashMap = new HashMap<Integer, List<Student>>();

পুনরুক্তি করার জন্য এই কোড এবং অ্যাড ছাত্র ওভার HashMap:

if (!hashMap.containsKey(locationId)) {
    List<Student> list = new ArrayList<Student>();
    list.add(student);

    hashMap.put(locationId, list);
} else {
    hashMap.get(locationId).add(student);
}

আপনি যদি সমস্ত শিক্ষার্থীর নির্দিষ্ট অবস্থানের বিশদ সহ চান তবে আপনি এটি ব্যবহার করতে পারেন:

hashMap.get(locationId);

যা আপনাকে একই স্থানে আইডি সহ সমস্ত ছাত্রকে পাবেন।


4
আপনি অবস্থান অবজেক্টের একটি তালিকা ঘোষণা করেছেন এবং পরবর্তী লাইনে আপনি আগের তালিকায় একটি শিক্ষার্থী অবজেক্ট যুক্ত করেছেন যা একটি ত্রুটি ছুঁড়ে ফেলে should
ওজেভিএম

hashMap.get () হ্যাশম্যাপ.কন্ট্যানিসকে () মিথ্যা বলে প্রত্যাবর্তন করে। আপনি containsKey () মেথড থেকে কল বাঁচাতে পারে যদি আপনি একটি স্থানীয় Var প্রথম hashMap.get (), দোকান কলের ফলাফল, এবং চেক যদি এই স্থানীয় Var নাল
Esteve

259

জাভা 8 তে:

Map<String, List<Student>> studlistGrouped =
    studlist.stream().collect(Collectors.groupingBy(w -> w.stud_location));

Studentক্লাসে stud_locationবন্ধুত্বপূর্ণ হিসাবে নির্দিষ্ট করা হয় কারণ । কেবল Studentক্লাস এবং একই প্যাকেজে সংজ্ঞায়িত যে কোনও শ্রেণি Studentঅ্যাক্সেস করতে পারে stud_location। আপনি যদি এর public String stud_location;পরিবর্তে রাখেন তবে এটি কাজ করা String stud_location;উচিত। অথবা আপনি একটি গিটার ফাংশন সংজ্ঞায়িত করতে পারেন। Cs.princeton.edu/courses/archive/spr96/cs333/java/tutorial/java/… এ
হিশান

32
Map<String, List<Student>> map = new HashMap<String, List<Student>>();

for (Student student : studlist) {
    String key  = student.stud_location;
    if(map.containsKey(key)){
        List<Student> list = map.get(key);
        list.add(student);

    }else{
        List<Student> list = new ArrayList<Student>();
        list.add(student);
        map.put(key, list);
    }

}

8

জাভা 8 ব্যবহার করা

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class Student {

    String stud_id;
    String stud_name;
    String stud_location;

    public String getStud_id() {
        return stud_id;
    }

    public String getStud_name() {
        return stud_name;
    }

    public String getStud_location() {
        return stud_location;
    }



    Student(String sid, String sname, String slocation) {

        this.stud_id = sid;
        this.stud_name = sname;
        this.stud_location = slocation;

    }
}

class Temp
{
    public static void main(String args[])
    {

        Stream<Student> studs = 
        Stream.of(new Student("1726", "John", "New York"),
                new Student("4321", "Max", "California"),
                new Student("2234", "Max", "Los Angeles"),
                new Student("7765", "Sam", "California"));
        Map<String, Map<Object, List<Student>>> map= studs.collect(Collectors.groupingBy(Student::getStud_name,Collectors.groupingBy(Student::getStud_location)));
                System.out.println(map);//print by name and then location
    }

}

ফলাফলটি হবে:

{
    Max={
        Los Angeles=[Student@214c265e], 
        California=[Student@448139f0]
    }, 
    John={
        New York=[Student@7cca494b]
    }, 
    Sam={
        California=[Student@7ba4f24f]
    }
}

প্রশ্নের উত্তর হিসাবে একই উদাহরণ আটকে এই উত্তরটি উন্নত করা যেতে পারে। এছাড়াও ফলাফলটি অনুরোধ করা কাঙ্ক্ষিত আউটপুটটির সাথে মেলে না।
পিম হাজেব্রুক

6

জাভা 8 গ্রুপিংয়ের মাধ্যমে কালেক্টর

সম্ভবত দেরি হয়ে গেছে তবে আমি এই সমস্যার সাথে একটি উন্নত ধারণা ভাগ করতে চাই। এটি মূলত @ ভিটালই ফেদোরেনকো জবাবের মতো তবে আশেপাশে আরও হাততালি দিয়ে খেলতে হবে।

আপনি কেবলমাত্র Collectors.groupingBy()গ্রুপিং যুক্তিটি ফাংশন প্যারামিটার হিসাবে পাস করে ব্যবহার করতে পারবেন এবং কী পরামিতি ম্যাপিংয়ের সাথে বিভক্ত তালিকা পাবেন। নোট করুন যে Optionalযখন সরবরাহিত তালিকা থাকে তখন অবাঞ্ছিত এনপিই এড়ানোর জন্য ব্যবহার করা হয়null

public static <E, K> Map<K, List<E>> groupBy(List<E> list, Function<E, K> keyFunction) {
    return Optional.ofNullable(list)
            .orElseGet(ArrayList::new)
            .stream()
            .collect(Collectors.groupingBy(keyFunction));
}

এখন আপনি এটি দিয়ে যেকোনো কিছুকে গ্রুপবাই করতে পারেন । প্রশ্নে ব্যবহারের ক্ষেত্রে এখানে

Map<String, List<Student>> map = groupBy(studlist, Student::getLocation);

হতে পারে আপনি এইটি জাভা 8 এর জন্য নির্দেশিকাটিও সংগ্রহ করতে চান Guide


4

আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

Map<String, List<Student>> groupedStudents = new HashMap<String, List<Student>>();
for (Student student: studlist) {
    String key = student.stud_location;
    if (groupedStudents.get(key) == null) {
        groupedStudents.put(key, new ArrayList<Student>());
    }
    groupedStudents.get(key).add(student);
}

//ছাপা

Set<String> groupedStudentsKeySet = groupedCustomer.keySet();
for (String location: groupedStudentsKeySet) {
   List<Student> stdnts = groupedStudents.get(location);
   for (Student student : stdnts) {
        System.out.println("ID : "+student.stud_id+"\t"+"Name : "+student.stud_name+"\t"+"Location : "+student.stud_location);
    }
}

4

তুলনাকারী ব্যবহার করে জাভাতে এসকিউএল গ্রুপ দ্বারা বৈশিষ্ট্যটি প্রয়োগ করুন, তুলনাকারী আপনার কলামের ডেটা তুলনা করবে এবং এটি বাছাই করবে। মূলত যদি আপনি সাজানো ডেটা রাখেন যা গোষ্ঠীভিত্তিক ডেটা হিসাবে দেখায়, উদাহরণস্বরূপ যদি আপনার একই পুনরাবৃত্তি কলামের ডেটা থাকে তবে একই ধরণের ডেটা রাখার প্রক্রিয়াটি তাদেরকে সাজান এবং তারপরে অন্য ডেটা অনুসন্ধান করুন যা ভিন্ন ভিন্ন ডেটা। এটি অপ্রত্যক্ষভাবে একই ডেটার গ্রুপিং হিসাবে দেখা।

public class GroupByFeatureInJava {

    public static void main(String[] args) {
        ProductBean p1 = new ProductBean("P1", 20, new Date());
        ProductBean p2 = new ProductBean("P1", 30, new Date());
        ProductBean p3 = new ProductBean("P2", 20, new Date());
        ProductBean p4 = new ProductBean("P1", 20, new Date());
        ProductBean p5 = new ProductBean("P3", 60, new Date());
        ProductBean p6 = new ProductBean("P1", 20, new Date());

        List<ProductBean> list = new ArrayList<ProductBean>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
        list.add(p6);

        for (Iterator iterator = list.iterator(); iterator.hasNext();) {
            ProductBean bean = (ProductBean) iterator.next();
            System.out.println(bean);
        }
        System.out.println("******** AFTER GROUP BY PRODUCT_ID ******");
        Collections.sort(list, new ProductBean().new CompareByProductID());
        for (Iterator iterator = list.iterator(); iterator.hasNext();) {
            ProductBean bean = (ProductBean) iterator.next();
            System.out.println(bean);
        }

        System.out.println("******** AFTER GROUP BY PRICE ******");
        Collections.sort(list, new ProductBean().new CompareByProductPrice());
        for (Iterator iterator = list.iterator(); iterator.hasNext();) {
            ProductBean bean = (ProductBean) iterator.next();
            System.out.println(bean);
        }
    }
}

class ProductBean {
    String productId;
    int price;
    Date date;

    @Override
    public String toString() {
        return "ProductBean [" + productId + " " + price + " " + date + "]";
    }
    ProductBean() {
    }
    ProductBean(String productId, int price, Date date) {
        this.productId = productId;
        this.price = price;
        this.date = date;
    }
    class CompareByProductID implements Comparator<ProductBean> {
        public int compare(ProductBean p1, ProductBean p2) {
            if (p1.productId.compareTo(p2.productId) > 0) {
                return 1;
            }
            if (p1.productId.compareTo(p2.productId) < 0) {
                return -1;
            }
            // at this point all a.b,c,d are equal... so return "equal"
            return 0;
        }
        @Override
        public boolean equals(Object obj) {
            // TODO Auto-generated method stub
            return super.equals(obj);
        }
    }

    class CompareByProductPrice implements Comparator<ProductBean> {
        @Override
        public int compare(ProductBean p1, ProductBean p2) {
            // this mean the first column is tied in thee two rows
            if (p1.price > p2.price) {
                return 1;
            }
            if (p1.price < p2.price) {
                return -1;
            }
            return 0;
        }
        public boolean equals(Object obj) {
            // TODO Auto-generated method stub
            return super.equals(obj);
        }
    }

    class CompareByCreateDate implements Comparator<ProductBean> {
        @Override
        public int compare(ProductBean p1, ProductBean p2) {
            if (p1.date.after(p2.date)) {
                return 1;
            }
            if (p1.date.before(p2.date)) {
                return -1;
            }
            return 0;
        }
        @Override
        public boolean equals(Object obj) {
            // TODO Auto-generated method stub
            return super.equals(obj);
        }
    }
}

উপরোক্ত প্রোডাক্ট বিয়ান তালিকার জন্য আউটপুট এখানে গ্রাওপ অনুসারে সম্পন্ন হয়েছে, আপনি যদি এখানে ইনপুট ডেটা দেখতে পান যে সংগ্রহশালায় প্রোডাক্ট বিনের তালিকা দেওয়া হয় ort সাজান্ট (আপনার প্রয়োজনীয় কলামের তুলনাকারীর তালিকা, তালিকা) এটি আপনার তুলনামূলক প্রয়োগের উপর ভিত্তি করে সাজবে এবং আপনি নীচের আউটপুটে গ্রুপড ডেটা দেখতে সক্ষম হবেন। আশাকরি এটা সাহায্য করবে...

    ******** গ্রুপিংয়ের আগে ইনপুট ডেটা এই ভাবে দেখায় ******
    প্রোডাক্ট বিয়ান [পি 1 20 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 1 30 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 2 20 সোমবার নভেম্বর 09:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 1 20 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 3 60 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 1 20 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    ******** উত্পাদকের পরে প্রোডাক্ট এসআইডি ******
    প্রোডাক্ট বিয়ান [পি 1 20 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 1 30 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 1 20 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 1 20 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 2 20 সোমবার নভেম্বর 09:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 3 60 সোমবার 17 নভেম্বর 9:31:01 IST 2014]

    ******** মূল্য অনুসারে গ্রুপ ******
    প্রোডাক্ট বিয়ান [পি 1 20 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 1 20 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 2 20 সোমবার নভেম্বর 09:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 1 20 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 1 30 সোমবার 17 নভেম্বর 9:31:01 IST 2014]
    প্রোডাক্ট বিয়ান [পি 3 60 সোমবার 17 নভেম্বর 9:31:01 IST 2014]


4
হাই, দয়া করে একাধিকবার একই উত্তর পোস্ট করবেন না, এবং দয়া করে এটি কীভাবে কাজ করে এবং উপরের প্রশ্নে কীভাবে সমস্যাটি সমাধান করে তা ব্যাখ্যা ছাড়াই কাঁচা কোড পোস্ট করবেন না।
মাদুর

দুঃখিত বন্ধু, কোডটি আটকে দেওয়ার ক্ষেত্রে কিছু ভুল হয়েছিল, যেহেতু এটি একাধিকবার হয়ে উঠেছে। আমি যা পোস্ট করেছি তার ব্যাখ্যা সম্পাদনা করেছি have আশা করি এখন ভাল লাগছে ???
রবি বেলি

আমি কিছু মিস করছি বা এই কোডটি ক্ষেত্রের দ্বারা গ্রুপিংয়ের পরিবর্তে বাছাই করছে? আমি আইডি অনুসারে বাছাই করা পণ্যগুলি দেখতে পাই, তারপরে মূল্য
অনুদানকারী 7

1
public class Test9 {

    static class Student {

        String stud_id;
        String stud_name;
        String stud_location;

        public Student(String stud_id, String stud_name, String stud_location) {
            super();
            this.stud_id = stud_id;
            this.stud_name = stud_name;
            this.stud_location = stud_location;
        }

        public String getStud_id() {
            return stud_id;
        }

        public void setStud_id(String stud_id) {
            this.stud_id = stud_id;
        }

        public String getStud_name() {
            return stud_name;
        }

        public void setStud_name(String stud_name) {
            this.stud_name = stud_name;
        }

        public String getStud_location() {
            return stud_location;
        }

        public void setStud_location(String stud_location) {
            this.stud_location = stud_location;
        }

        @Override
        public String toString() {
            return " [stud_id=" + stud_id + ", stud_name=" + stud_name + "]";
        }

    }

    public static void main(String[] args) {

        List<Student> list = new ArrayList<Student>();
        list.add(new Student("1726", "John Easton", "Lancaster"));
        list.add(new Student("4321", "Max Carrados", "London"));
        list.add(new Student("2234", "Andrew Lewis", "Lancaster"));
        list.add(new Student("5223", "Michael Benson", "Leeds"));
        list.add(new Student("5225", "Sanath Jayasuriya", "Leeds"));
        list.add(new Student("7765", "Samuael Vatican", "California"));
        list.add(new Student("3442", "Mark Farley", "Ladykirk"));
        list.add(new Student("3443", "Alex Stuart", "Ladykirk"));
        list.add(new Student("4321", "Michael Stuart", "California"));

        Map<String, List<Student>> map1  =

                list
                .stream()

            .sorted(Comparator.comparing(Student::getStud_id)
                    .thenComparing(Student::getStud_name)
                    .thenComparing(Student::getStud_location)
                    )

                .collect(Collectors.groupingBy(

                ch -> ch.stud_location

        ));

        System.out.println(map1);

/*
  Output :

{Ladykirk=[ [stud_id=3442, stud_name=Mark Farley], 
 [stud_id=3443, stud_name=Alex Stuart]], 

 Leeds=[ [stud_id=5223, stud_name=Michael Benson],  
 [stud_id=5225, stud_name=Sanath Jayasuriya]],


  London=[ [stud_id=4321, stud_name=Max Carrados]],


   Lancaster=[ [stud_id=1726, stud_name=John Easton],  

   [stud_id=2234, stud_name=Andrew Lewis]], 


   California=[ [stud_id=4321, stud_name=Michael Stuart],  
   [stud_id=7765, stud_name=Samuael Vatican]]}
*/


    }// main
}

0

আপনি এটির মতো বাছাই করতে পারেন:

    Collections.sort(studlist, new Comparator<Student>() {

        @Override
        public int compare(Student o1, Student o2) {
            return o1.getStud_location().compareTo(o2.getStud_location());
        }
    });

ধরে নিচ্ছি আপনার কাছেও আপনার ছাত্র শ্রেণিতে অবস্থানের জন্য গিটার রয়েছে।


4
বাছাই কেন? সমস্যা হচ্ছে গ্রুপকে গ্রুপ করার!
সঙ্কল্প

0

আপনি এটি করতে পারেন:

Map<String, List<Student>> map = new HashMap<String, List<Student>>();
List<Student> studlist = new ArrayList<Student>();
studlist.add(new Student("1726", "John", "New York"));
map.put("New York", studlist);

কীগুলি অবস্থান এবং শিক্ষার্থীদের মান তালিকাগুলি হবে। সুতরাং পরে আপনি কেবলমাত্র ব্যবহার করে একদল শিক্ষার্থী পেতে পারেন:

studlist = map.get("New York");

0

আপনি ব্যবহার করতে পারেন guava'রMultimaps

@Canonical
class Persion {
     String name
     Integer age
}
List<Persion> list = [
   new Persion("qianzi", 100),
   new Persion("qianzi", 99),
   new Persion("zhijia", 99)
]
println Multimaps.index(list, { Persion p -> return p.name })

এটি মুদ্রণ:

[কিয়ানজি: [com.ctcf.message.Persion (কিয়ানজি, 100), com.ctcf.message.Persion (কিয়ানজি, 88)], জিজিয়া: [com.ctcf.message.Persion (zhijia, 99)]]


0
Function<Student, List<Object>> compositKey = std ->
                Arrays.asList(std.stud_location());
        studentList.stream().collect(Collectors.groupingBy(compositKey, Collectors.toList()));

আপনি যদি গ্রুপ দ্বারা একাধিক অবজেক্ট যুক্ত করতে চান তবে compositKeyকমা দ্বারা পৃথক পদ্ধতিতে কেবল অবজেক্টটি যুক্ত করতে পারেন :

Function<Student, List<Object>> compositKey = std ->
                Arrays.asList(std.stud_location(),std.stud_name());
        studentList.stream().collect(Collectors.groupingBy(compositKey, Collectors.toList()));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.