Comparable in Java 8 style | Selenium Forum
M
Mohammed Sajjad Posted on 03/06/2020

I have this below program which sorts based on runs.

class Cricketer implements Comparable<Cricketer> {
    int runs;
    String name;

    public Cricketer(String name, int runs) {
        super();
        this.name = name;
        this.runs = runs;
    }

    @Override
    public String toString() {
        return name + "    " + runs;
    }

    @Override
    public int compareTo(Cricketer that) {
        if (this.runs > that.runs) {
            return 1;
        }
        if (this.runs < that.runs) {
            return -1;
        }
        return 0;
    }

    public static void main(String[] args) {
        List<Cricketer> cricketers = new ArrayList<Cricketer>();
        cricketers.add(new Cricketer("Bradman", 9996));
        cricketers.add(new Cricketer("Sachin", 14000));
        cricketers.add(new Cricketer("Dravid", 12000));
        cricketers.add(new Cricketer("Ponting", 11000));
        System.out.println(cricketers); //[Bradman 9996,   Sachin 14000,  Dravid 12000,  Ponting 11000]
        Collections.sort(cricketers);
        System.out.println(cricketers); //[Bradman 9996,   Ponting 11000, Dravid 12000,  Sachin 14000]
    }
}

I wanted to write the same program using Java 8. But I am failing to do so. Please check out my below code:

class Cricketer {
    int runs;
    String name;

    public Cricketer(String name, int runs) {
        super();
        this.name = name;
        this.runs = runs;
    }

    @Override
    public String toString() {
        return name + "    " + runs;
    }
    Comparator<Cricketer> comp = (that) -> this.runs > that.runs ? 1 : this.runs < that.runs ? -1 : 0; //
    // 'Cricketer.this' cannot be referenced from a static context

    public static void main(String[] args) {
        List<Cricketer> cricketers = new ArrayList<Cricketer>();
        cricketers.add(new Cricketer("Bradman", 9996));
        cricketers.add(new Cricketer("Sachin", 14000));
        cricketers.add(new Cricketer("Dravid", 12000));
        cricketers.add(new Cricketer("Ponting", 11000));
        System.out.println(cricketers);
        Collections.sort(cricketers, comp); // reason: no instance(s) of type variable(s) T exist so that Comparable<Cricketer> conforms to Comparator<? super T>
        // conforms to Comparable<? super T
        System.out.println(cricketers);
    }
}

 

Please can anyone help me solve this issue?


M
Mohammed Sajjad Replied on 03/06/2020

I found the solution using Comparator, but not using comparable

 

package Package1;

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

class Cricketer {
    int runs;
    String name;

    public Cricketer(String name, int runs) {
        super();
        this.name = name;
        this.runs = runs;
    }

    @Override
    public String toString() {
        return name + "    " + runs;
    }

    public static void main(String[] args) {
        Comparator<Cricketer> comp = Comparator.comparingInt(i -> i.runs);
//        Comparator<Cricketer> comp = (I1, I2) -> Integer.compare(I1.runs, I2.runs);
        List<Cricketer> cricketers = new ArrayList<Cricketer>();
        cricketers.add(new Cricketer("Bradman", 9996));
        cricketers.add(new Cricketer("Sachin", 14000));
        cricketers.add(new Cricketer("Dravid", 12000));
        cricketers.add(new Cricketer("Ponting", 11000));
        System.out.println(cricketers); //[Bradman 9996,   Sachin 14000,  Dravid 12000,  Ponting 11000]
        Collections.sort(cricketers, comp);
        System.out.println(cricketers); //[Bradman 9996,   Ponting 11000, Dravid 12000,  Sachin 14000]
    }
}

Can anyone please help me find a solution using comparable?


Y
Yogesh Chawla Replied on 03/06/2020

This is using Comparator interface using Lambda Expressions in Core Java

package com.programming.class21;

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

public class Cricketer2 {

int runs;
/**
* @return the runs
*/
public int getRuns() {
return runs;
}

/**
* @param runs the runs to set
*/
public void setRuns(int runs) {
this.runs = runs;
}

String name;

public Cricketer2(String name, int runs) {
super();
this.name = name;
this.runs = runs;
}

@Override
public String toString() {
return name + " " + runs;
}

//Comparator<Cricketer2> comp = (that) -> this.runs > that.runs ? 1 : this.runs < that.runs ? -1 : 0; //
// 'Cricketer.this' cannot be referenced from a static context

static Comparator<Cricketer2> comp2 = (h1, h2) -> (h1.getRuns() - h2.getRuns());


public static void main(String[] args) {
List<Cricketer2> cricketers = new ArrayList<>();
cricketers.add(new Cricketer2("Bradman", 9996));
cricketers.add(new Cricketer2("Sachin", 14000));
cricketers.add(new Cricketer2("Dravid", 12000));
cricketers.add(new Cricketer2("Ponting", 11000));
System.out.println(cricketers);
Collections.sort(cricketers, comp2);
System.out.println(cricketers);
}


}

 

Using Comparable interface, we can do it simply like this:

package com.programming.class21;

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

public class Cricketer2 implements Comparable<Cricketer2>{

int runs;
/**
* @return the runs
*/
public int getRuns() {
return runs;
}

/**
* @param runs the runs to set
*/
public void setRuns(int runs) {
this.runs = runs;
}

String name;

public Cricketer2(String name, int runs) {
super();
this.name = name;
this.runs = runs;
}

@Override
public String toString() {
return name + " " + runs;
}

@Override
public int compareTo(Cricketer2 that) {
if (this.runs > that.runs) {
return 1;
}
if (this.runs < that.runs) {
return -1;
}
return 0;
}

//Comparator<Cricketer2> comp = (that) -> this.runs > that.runs ? 1 : this.runs < that.runs ? -1 : 0; //
// 'Cricketer.this' cannot be referenced from a static context

//static Comparator<Cricketer2> comp2 = (h1, h2) -> (h1.getRuns() - h2.getRuns());


public static void main(String[] args) {
List<Cricketer2> cricketers = new ArrayList<>();
cricketers.add(new Cricketer2("Bradman", 9996));
cricketers.add(new Cricketer2("Sachin", 14000));
cricketers.add(new Cricketer2("Dravid", 12000));
cricketers.add(new Cricketer2("Ponting", 11000));
System.out.println(cricketers);
Collections.sort(cricketers); // reason: no instance(s) of type variable(s) T exist so that Comparable<Cricketer> conforms to Comparator<? super T>
// conforms to Comparable<? super T
System.out.println(cricketers);
}


}


Related Posts