জাভাতে স্ট্রিম.সোর্টড () সহ একটি তালিকা বাছাই করা


96

আমি একটি স্ট্রিম থেকে একটি তালিকা বাছাই করতে আগ্রহী। এই কোডটি আমি ব্যবহার করছি:

list.stream()
    .sorted((o1, o2)->o1.getItem().getValue().compareTo(o2.getItem().getValue()))
    .collect(Collectors.toList());

আমি কিছু অনুপস্থিত করছি? তালিকাটি বাছাই করা হচ্ছে না।

এটি সর্বনিম্ন মান সহ আইটেম অনুসারে তালিকাগুলি বাছাই করা উচিত।

for (int i = 0; i < list.size(); i++)
{
   System.out.println("list " + (i+1));
   print(list, i);
}

এবং মুদ্রণ পদ্ধতি:

public static void print(List<List> list, int i)
{
    System.out.println(list.get(i).getItem().getValue());
}

উত্তর:


147

এটি Collections.sort()প্যারামিটারের রেফারেন্সটি সাজানো হয় এমন নয়। এক্ষেত্রে আপনি কেবল একটি সাজানো স্ট্রিম পান যা আপনাকে সংগ্রহ করতে হবে এবং শেষ পর্যন্ত অন্য ভেরিয়েবলকে অর্পণ করতে হবে:

List result = list.stream().sorted((o1, o2)->o1.getItem().getValue().
                                   compareTo(o2.getItem().getValue())).
                                   collect(Collectors.toList());

আপনি ফলাফল নির্ধারণের জন্য সবেমাত্র মিস করেছেন


67

list.sortপরিবর্তে ব্যবহার করুন:

list.sort((o1, o2) -> o1.getItem().getValue().compareTo(o2.getItem().getValue()));

এবং এটি ব্যবহার করে আরও সাবলীল করুন Comparator.comparing:

list.sort(Comparator.comparing(o -> o.getItem().getValue()));

এর যে কোনও একটির পরে, list নিজেই বাছাই করা হবে।

আপনার সমস্যাটি হ'ল বাছাই করা ডেটা ফেরত দেয়, এটি আপনার প্রত্যাশার মতো স্থানে সরে যায় না।list.stream.sorted


4
list.sort(Comparator.comparing(o -> o.getItem().getValue()));আমার কাছে নতুন ছিল দুর্দান্ত!
নিউরন

36

স্ট্রিমগুলি আরও ভালভাবে সাজানোর জন্য জাভা 8 বিভিন্ন ইউটিলিটি এপিআই পদ্ধতি সরবরাহ করে।

যদি আপনার তালিকাটি পূর্ণসংখ্যার (বা ডাবল, লং, স্ট্রিং ইত্যাদি) এর তালিকা হয় তবে আপনি কেবল জাভা সরবরাহকারীর ডিফল্ট তুলনাকারীর সাথে তালিকাটি বাছাই করতে পারেন।

List<Integer> integerList = Arrays.asList(1, 4, 3, 4, 5);

ফ্লাইতে তুলনামূলক তৈরি করা হচ্ছে:

integerList.stream().sorted((i1, i2) -> i1.compareTo(i2)).forEach(System.out::println);

জাভা 8 দ্বারা সরবরাহিত ডিফল্ট তুলনামূলক সহ যখন কোনও আর্গুমেন্ট সাজানো হয়নি ():

integerList.stream().sorted().forEach(System.out::println); //Natural order

যদি আপনি একই তালিকাটি বিপরীত ক্রমে সাজান করতে চান:

 integerList.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println); // Reverse Order

যদি আপনার তালিকাটি ব্যবহারকারী সংজ্ঞায়িত সামগ্রীর তালিকা হয় তবে:

List<Person> personList = Arrays.asList(new Person(1000, "First", 25, 30000),
        new Person(2000, "Second", 30, 45000),
        new Person(3000, "Third", 35, 25000));

ফ্লাইতে তুলনামূলক তৈরি করা হচ্ছে:

personList.stream().sorted((p1, p2) -> ((Long)p1.getPersonId()).compareTo(p2.getPersonId()))
        .forEach(person -> System.out.println(person.getName()));

Comparator.comperingLong () পদ্ধতিটি ব্যবহার করে (আমাদের তুলনাডুবল () রয়েছে, তুলনাও () পদ্ধতিগুলি):

personList.stream().sorted(Comparator.comparingLong(Person::getPersonId)).forEach(person -> System.out.println(person.getName()));

Comparator.compering () পদ্ধতি ব্যবহার করে (জেনেরিক পদ্ধতি যা সরবরাহকৃত পদ্ধতির উপর ভিত্তি করে তুলনা করে):

personList.stream().sorted(Comparator.comparing(Person::getPersonId)).forEach(person -> System.out.println(person.getName()));

আমরা তখন (কম্পিউটার) পদ্ধতিটি ব্যবহার করে শৃঙ্খলাবদ্ধ করতে পারি:

personList.stream().sorted(Comparator.comparing(Person::getPersonId).thenComparing(Person::getAge)).forEach(person -> System.out.println(person.getName())); //Sorting by person id and then by age.

ব্যক্তি শ্রেণি

public class Person {
    private long personId;
    private String name;
    private int age;
    private double salary;

    public long getPersonId() {
        return personId;
    }

    public void setPersonId(long personId) {
        this.personId = personId;
    }

    public Person(long personId, String name, int age, double salary) {
        this.personId = personId;
        this.name = name;
        this.age = age;

        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

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

4
আমিও মনে করি এটি সেরা এবং সঠিক উত্তর। ব্যবহার Comparator.comparing*করা হয় উপায় আরো ভালো এবং JDK8 ভিত্তিক পদ্ধতির
kakabali

0

মনে হচ্ছে এটি ঠিকঠাক কাজ করছে:

List<BigDecimal> list = Arrays.asList(new BigDecimal("24.455"), new BigDecimal("23.455"), new BigDecimal("28.455"), new BigDecimal("20.455"));
System.out.println("Unsorted list: " + list);
final List<BigDecimal> sortedList = list.stream().sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.toList());
System.out.println("Sorted list: " + sortedList);

উদাহরণ ইনপুট / আউটপুট

Unsorted list: [24.455, 23.455, 28.455, 20.455]
Sorted list: [20.455, 23.455, 24.455, 28.455]

আপনি কি নিশ্চিত যে আপনি sortedList[উপরের উদাহরণে] এর পরিবর্তে তালিকাটি যাচাই করছেন না অর্থাত আপনি stream()একটি নতুন Listঅবজেক্টে ফলাফলটি সংরক্ষণ করছেন এবং সেই বস্তুটি যাচাই করছেন?


0
Collection<Map<Item, Integer>> itemCollection = basket.values();
Iterator<Map<Item, Integer>> itemIterator =   itemCollection.stream().sorted(new TestComparator()).collect(Collectors.toList()).iterator();



package com.ie.util;

import com.ie.item.Item;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class TestComparator implements Comparator<Map<Item, Integer>> {

// comparator is used to sort the Items based on the price


    @Override
    public int compare(Map<Item, Integer> o1, Map<Item, Integer> o2) {


      //  System.out.println("*** compare method will be called *****");


        Item item1 = null;
        Item item2 = null;


        Set<Item> itemSet1 = o1.keySet();
        Iterator<Item> itemIterator1 = itemSet1.iterator();
        if(itemIterator1.hasNext()){
           item1 =   itemIterator1.next();
        }

        Set<Item> itemSet2 = o2.keySet();
        Iterator<Item> itemIterator2 = itemSet2.iterator();
        if(itemIterator2.hasNext()){
            item2 =   itemIterator2.next();
        }


        return -item1.getPrice().compareTo(item2.getPrice());


    }
}

**** নেস্টেড মানচিত্রের অবজেক্টগুলিকে মানচিত্রের মতো> এখানে আইটেম অবজেক্টের মূল্যের উপর ভিত্তি করে বাছাই করতে সহায়ক helpful


0

এটি একটি সাধারণ উদাহরণ:

List<String> citiesName = Arrays.asList( "Delhi","Mumbai","Chennai","Banglore","Kolkata");
System.out.println("Cities : "+citiesName);
List<String> sortedByName = citiesName.stream()
                .sorted((s1,s2)->s2.compareTo(s1))
                        .collect(Collectors.toList());
System.out.println("Sorted by Name : "+ sortedByName);

আপনার আইডিই কোডটি সংকলন করতে jdk 1.8 বা উপরের সংস্করণ পাচ্ছে না।

আপনার_প্রজেক্ট > বৈশিষ্ট্য> প্রকল্পের দিকগুলি > জাভা সংস্করণ 1.8 এর জন্য জাভা সংস্করণ 1.8 সেট করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.