বিপরীত ক্রমে একটি স্ট্রিম বাছাই করতে কীভাবে একটি জাভ 8 ল্যাম্বডা ব্যবহার করবেন?


180

আমি জাভা লাম্বদা ব্যবহার করছি একটি তালিকা বাছাই করতে।

আমি কীভাবে এটি বিপরীতে সাজিয়ে তুলতে পারি?

আমি এই পোস্টে দেখেছি , তবে আমি জাভা 8 লম্বা ব্যবহার করতে চাই।

এখানে হ্যাক হিসাবে আমার কোড (আমি * -1 ব্যবহার করেছি)

Arrays.asList(files).stream()
    .filter(file -> isNameLikeBaseLine(file, baseLineFile.getName()))
    .sorted(new Comparator<File>() {
        public int compare(File o1, File o2) {
            int answer;
            if (o1.lastModified() == o2.lastModified()) {
                answer = 0;
            } else if (o1.lastModified() > o2.lastModified()) {
                answer = 1;
            } else {
                answer = -1;
            }
            return -1 * answer;
        }
    })
    .skip(numOfNewestToLeave)
    .forEach(item -> item.delete());

"বিপরীত ক্রম" বলতে কী বোঝ? যদি আপনি এর সাথে প্রতিস্থাপন -1 * answerকরেন answerতবে অর্ডারটি যা ছিল তার বিপরীতে পরিবর্তন হবে -1 * ...
ডেসব্লিংকনলাইট

2
সতর্ক থাকুন! আপনার সমস্ত কোডের পরামর্শ দেয় আপনি forEachOrderedপরিবর্তে ব্যবহার করতে চানforEach
হলগার

এটা কেন? তুমি কি ব্যাখ্যা করতে পারো?
এলাদ বেনদা 2

1
লিঙ্কগুলি অনুসরণ করুন। সহজভাবে বলেছিলেন, forEachOrderedনাম অনুসারে, এনকাউন্টার অর্ডারটি সম্পর্কে প্রাসঙ্গিক যা আপনি নির্দিষ্ট কিছু সংখ্যক নতুন ফাইল এড়িয়ে যেতে চান যা "পরিবর্তনের সময় অনুসারে বাছাই করা" আদেশের উপর নির্ভর করে ।
হলগার

1
একজন প্রয়াত বিট, আমি স্বীকার করছি করতে চান যে আপনার বোঝার কিভাবে sortskip→ (unordered) forEachকাজ করা উচিত, এটা প্রকৃতপক্ষে আজকের JREs এই ভাবে কাজ করতে বাস্তবায়িত হয় সঠিক এবং কিন্তু 2015, ফিরে যখন পূর্ববর্তী মন্তব্য করা হয়েছে, এটা সত্যিই একটি সমস্যা ছিল (আপনি এই প্রশ্নে পড়তে পারেন )।
হলগার

উত্তর:


217

জাভাতে অ্যারেলিস্ট <লং> ক্রমহ্রাসমান ক্রমে কীভাবে সাজানো যায় তার সাথে আপনি যে সমাধানটি যুক্ত করেছেন সেটিকে আপনি কীভাবে সমাধান করতে পারেন? এটি একটি ল্যাম্বডায় মোড়ানো দ্বারা:

.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())

নোট করুন যে f2 হ'ল প্রথম যুক্তি Long.compare, দ্বিতীয়টি নয়, সুতরাং ফলাফলটি বিপরীত হবে।


224
… বাComparator.comparingLong(File::lastModified).reversed()
হোলার

3
স্ট্রিং @Holger স্ট্রীম, এবং থাকার comparingLong(v->Long.valueOf(v)).reversed()ছোঁড়ার সংকলন ত্রুটি: java.lang.valueOf(java.lang.String) cannot be used on java.lang.valueOf(java.lang.Object)। কেন?
টিইনা

3
@ টিইনা: দেখুন তুলনা করুন.বিপরীত () ল্যাম্বডা ব্যবহার করে সংকলন করে নাcomparingLong(Long::valueOf).reversed()পরিবর্তে আপনি চেষ্টা করতে পারেন । বাCollections.reverseOrder(comparingLong(v->Long.valueOf(v)))
হোলার

এই লিঙ্কটির জন্য @ বৃহত্তর ধন্যবাদ তবে স্টুয়ার্ট "কেন পুরোপুরি নিশ্চিত নয়"। আমি বিভ্রান্ত হয়ে পড়েছিলাম যখন দেখলাম উভয় পদ্ধতি Tপরিবর্তে রেফারেন্স করা হয়েছে Object, অর্থ বস্তুর প্রকারটি হারাতে হবে না। তবে আসলে তা। এ নিয়েই আমি বিভ্রান্ত।
টিইনা

3
@ টিইনা: এটি লক্ষ্য প্রকারের পিছনে প্রচার যা কাজ করে না। যদি আপনার চেনের প্রাথমিক অভিব্যক্তিটি একা একা টাইপ করে থাকে তবে এটি জাভা ৮ এর আগে যেমন শৃঙ্খলা দিয়ে কাজ করে 8. যেমন আপনি তুলনামূলক উদাহরণের সাথে দেখতে পারেন কোনও পদ্ধতি রেফারেন্স ব্যবহার করে, অর্থাৎ comparingLong(Long::valueOf).reversed()কাজ করে, তেমনি স্পষ্টভাবে টাইপ করা ল্যাম্বদা এক্সপ্রেশন কাজ comparingLong((String v) -> Long.valueOf(v)).reversed()কাজ করে। এছাড়াও ব্যর্থ হয় যেখানে স্ট্যান্ড-একল টাইপ সরবরাহ করে Stream.of("foo").mapToInt(s->s.length()).sum()works "foo"Stream.of().mapToInt(s-> s.length()).sum()
হোলার

170

যদি আপনার স্ট্রিম উপাদানগুলি প্রয়োগ করে Comparableতবে সমাধানটি আরও সহজ হয়ে যায়:

 ...stream()
 .sorted(Comparator.reverseOrder())

3
বা...stream().max(Comparator.naturalOrder())
ফিলিপ

1
তারিখের সাথে তুলনা করে একটি সংগ্রহের মধ্যে অতি সাম্প্রতিক উপাদানটির জন্য.stream().max(Comparator.comparing(Clazz::getDate))
মার্কো পেলেগ্রিনি

1
যদি উপাদান না হয় ComparableCollections.reverseএরকম বাধা নেই।
উইলমল

63

ব্যবহার

Comparator<File> comparator = Comparator.comparing(File::lastModified); 
Collections.sort(list, comparator.reversed());

তারপর

.forEach(item -> item.delete());

3
ঠিক আছে, তিনি স্ট্রিম সম্পর্কে জিজ্ঞাসা করেছিলেন, তবে তবে আপনার উত্তরটি আমি পছন্দ করি।
টিম বাথ

এটি "ক্রিয়ামূলক" এটি করার উপায় নয় ... এর পার্শ্ব প্রতিক্রিয়া হয়েছে!
প্রোগ্রামার

38

আপনি একটি পদ্ধতি রেফারেন্স ব্যবহার করতে পারেন:

import static java.util.Comparator.*;
import static java.util.stream.Collectors.*;

Arrays.asList(files).stream()
    .filter(file -> isNameLikeBaseLine(file, baseLineFile.getName()))
    .sorted(comparing(File::lastModified).reversed())
    .skip(numOfNewestToLeave)
    .forEach(item -> item.delete());

পদ্ধতির রেফারেন্সের বিকল্পে আপনি ল্যাম্বডা এক্সপ্রেশন ব্যবহার করতে পারেন, সুতরাং তুলনা করার যুক্তিটি হয়ে উঠুন:

.sorted(comparing(file -> file.lastModified()).reversed());

19

বিকল্প উপায় ভাগ করে নেওয়া:

উচ্চক্রমে

List<Animal> animals = this.service.findAll();
animals = animals.stream().sorted(Comparator.comparing(Animal::getName)).collect(Collectors.toList());

DESC

List<Animal> animals = this.service.findAll();
animals = animals.stream().sorted(Comparator.comparing(Animal::getName).reversed()).collect(Collectors.toList());

4

এটি জাভা 8 এবং বিপরীত তুলনামূলক ব্যবহার করে সহজেই করা যায় ।

আমি একটি ডিরেক্টরি থেকে ফাইলগুলির একটি তালিকা তৈরি করেছি, যা আমি বাছাই করা, বাছাই করা এবং বিপরীত অনুসারে সাজানোর জন্য একটি সাধারণ তুলনামূলক ব্যবহার করে এবং তারপরে বিপরীত সংস্করণটি পেতে তার উপর বিপরীত () কল করে।

নীচে কোড দেখুন:

package test;

import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

public class SortTest {
    public static void main(String... args) {
        File directory = new File("C:/Media");
        File[] files = directory.listFiles();
        List<File> filesList = Arrays.asList(files);

        Comparator<File> comparator = Comparator.comparingLong(File::lastModified);
        Comparator<File> reverseComparator = comparator.reversed();

        List<File> forwardOrder = filesList.stream().sorted(comparator).collect(Collectors.toList());
        List<File> reverseOrder = filesList.stream().sorted(reverseComparator).collect(Collectors.toList());

        System.out.println("*** Unsorted ***");
        filesList.forEach(SortTest::processFile);

        System.out.println("*** Sort ***");
        forwardOrder.forEach(SortTest::processFile);

        System.out.println("*** Reverse Sort ***");
        reverseOrder.forEach(SortTest::processFile);
    }

    private static void processFile(File file) {
        try {
            if (file.isFile()) {
                System.out.println(file.getCanonicalPath() + " - " + new Date(file.lastModified()));
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

3

জাভা 8 সংগ্রহের সাথে ফাইল তালিকা বাছাই করুন

ফাইল তালিকা সাজানোর জন্য সংগ্রহ এবং তুলনামূলক জাভা 8 কীভাবে ব্যবহার করবেন তা উদাহরণ।

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class ShortFile {

    public static void main(String[] args) {
        List<File> fileList = new ArrayList<>();
        fileList.add(new File("infoSE-201904270100.txt"));
        fileList.add(new File("infoSE-201904280301.txt"));
        fileList.add(new File("infoSE-201904280101.txt"));
        fileList.add(new File("infoSE-201904270101.txt"));

        fileList.forEach(x -> System.out.println(x.getName()));
        Collections.sort(fileList, Comparator.comparing(File::getName).reversed());
        System.out.println("===========================================");
        fileList.forEach(x -> System.out.println(x.getName()));
    }
}

1

সাধারণভাবে, তুলনামূলক এবং সংগ্রহ ব্যবহার করে আপনি JAVA 8 ব্যবহার করে বিপরীত ক্রমে নীচের মতো বাছাই করতে পারেন

import java.util.Comparator;;
import java.util.stream.Collectors;

Arrays.asList(files).stream()
    .sorted(Comparator.comparing(File::getLastModified).reversed())
    .collect(Collectors.toList());

0

বিপরীত বাছাইয়ের জন্য x1.compareTo (x2) পদ্ধতি কল করার জন্য কেবল x1, x2 এর ক্রম পরিবর্তন করুন ফলাফল একে অপরের বিপরীত হবে

ডিফল্ট আদেশ

List<String> sortedByName = citiesName.stream().sorted((s1,s2)->s1.compareTo(s2)).collect(Collectors.toList());
System.out.println("Sorted by Name : "+ sortedByName);

বিপরীত ক্রম

List<String> reverseSortedByName = citiesName.stream().sorted((s1,s2)->s2.compareTo(s1)).collect(Collectors.toList());
System.out.println("Reverse Sorted by Name : "+ reverseSortedByName );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.