Comparator, Compare

Kategori: Java , 14 Temmuz 2019 , JanFranco


Bu yazımızda sort methodunu kullanarak, veri sıralayacağız. Buna kendi yazdığımız sınıftan objeler de dahil. Collections sınıfının sort methodunu kullanacağız. Bu sort methodunun bir özelliği mevcut. Eğer bir sınıf açar ve Comparator interfacesini implemente edersek, compare methodunu değiştirerek sıralamayı değiştirebiliriz. Görelim, ilk olarak bir önceki yazımızda açtığımız Player sınıfını tekrar oluşturalım:


class Player implements Comparable<Player>{
	
	private String name;
	private int score;
	
	public Player(String isim, int score) {
		this.name = isim;
		this.score = score;
	}

	@Override
	public String toString() {
		return "|||| score: " + score + " name: " + name + " ||||";
	}

	@Override
	public int compareTo(Player player) {
		
		if(this.score < player.score){
			return -1;
		}
		else if(this.score > player.score){
			return 1;
		}
		
		return 0;
	}

	public String getName() {
		return name;
	}

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

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}
	
}
Şimdi büyükten küçüğe String sıralamak için bir sınıf açalım:

class BiggerToSmallerString implements Comparator<String>{

	@Override
	public int compare(String o1, String o2) {
		return -o1.compareTo(o2);
	}
	
}
Comparator interafecesini implemente ettik ve compare methodunu override etmiş olduk. compare methodunda da compateTo methodunu kullanarak karşılaştırma yapıyor ve bir değer return ediyoruz. Kullanalım:

List<String> list = new ArrayList<>();

list.add("Java");
list.add("Phython");
list.add("C++");
list.add("Go");
list.add("PHP");

Collections.sort(list, new BiggerToSmallerString());

for(String s : list){
	System.out.println(s);
}
Konsolda:

Phython
PHP
Java
Go
C++
Şimdi de Player sınıfından objeleri sıralayalım. Bunun için bir sınıf açıyoruz:

class BiggerToSmallerPlayer implements Comparator<Player>{

	@Override
	public int compare(Player o1, Player o2) {
		if(o1.getScore() > o2.getScore()){
			return -1;
		}
		else if(o1.getScore() < o2.getScore()){
			return 1;
		}
		
		return 0;
	}
	
}
Kullanalım:

List<Player> list2 = new ArrayList<Player>();

list2.add(new Player("JanFranco", 999));
list2.add(new Player("JaneFranco", 1000));
list2.add(new Player("Player3", 5));
list2.add(new Player("Player4", 10000000));

Collections.sort(list2, new BiggerToSmallerPlayer());

for(Player test : list2){
	System.out.println(test);
}

System.out.println("************************");

List<Player> list3 = new ArrayList<Player>();

list3.add(new Player("JanFranco", 999));
list3.add(new Player("JaneFranco", 1000));
list3.add(new Player("QQQQ", 5));
list3.add(new Player("AAAA", 10000000));

Collections.sort(list3, new Comparator<Player>() {

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

for(Player test : list3){
	System.out.println(test);
}
Burada ilk kullanım alışık olduğumuz kullanımdır, bir sıkıntı yoktur ancak list3 için sıralama yaparken Anonymous sınıfları kullandık. Ekstradan sınıf açmak istemiyorsak, sınıfı bir kez kullanacaksak yararlı olabilir. Çıktıları görelim:

*********************
|||| score: 10000000 name: Player4 ||||
|||| score: 1000 name: JaneFranco ||||
|||| score: 999 name: JanFranco ||||
|||| score: 5 name: Player3 ||||
************************
|||| score: 10000000 name: AAAA ||||
|||| score: 999 name: JanFranco ||||
|||| score: 1000 name: JaneFranco ||||
|||| score: 5 name: QQQQ ||||
list2'yi skorlara göre, list3'ü isim bazında alfabetik olarak sıraladık. Tüm kodlar:

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

class BiggerToSmallerString implements Comparator<String>{

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

class BiggerToSmallerPlayer implements Comparator<Player>{

	@Override
	public int compare(Player o1, Player o2) {
		if(o1.getScore() > o2.getScore()){
			return -1;
		}
		else if(o1.getScore() < o2.getScore()){
			return 1;
		}
		
		return 0;
	}
	
}

class Player implements Comparable<Player>{
	
	private String name;
	private int score;
	
	public Player(String isim, int score) {
		this.name = isim;
		this.score = score;
	}

	@Override
	public String toString() {
		return "|||| score: " + score + " name: " + name + " ||||";
	}

	@Override
	public int compareTo(Player player) {
		
		if(this.score < player.score){
			return -1;
		}
		else if(this.score > player.score){
			return 1;
		}
		
		return 0;
	}

	public String getName() {
		return name;
	}

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

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}
	
}

public class Main_class {

	public static void main(String[] args){
		
		List<String> list = new ArrayList<>();
		
		list.add("Java");
		list.add("Phython");
		list.add("C++");
		list.add("Go");
		list.add("PHP");
		
		Collections.sort(list, new BiggerToSmallerString());
		
		for(String s : list){
			System.out.println(s);
		}
		
		System.out.println("*********************");
		
		List<Player> list2 = new ArrayList<Player>();
		
		list2.add(new Player("JanFranco", 999));
		list2.add(new Player("JaneFranco", 1000));
		list2.add(new Player("Player3", 5));
		list2.add(new Player("Player4", 10000000));
		
		Collections.sort(list2, new BiggerToSmallerPlayer());
		
		for(Player test : list2){
			System.out.println(test);
		}
		
		System.out.println("************************");
		
		List<Player> list3 = new ArrayList<Player>();
		
		list3.add(new Player("JanFranco", 999));
		list3.add(new Player("JaneFranco", 1000));
		list3.add(new Player("QQQQ", 5));
		list3.add(new Player("AAAA", 10000000));
		
		Collections.sort(list3, new Comparator<Player>() {
		
			@Override
			public int compare(Player o1, Player o2) {
				
				return o1.getName().compareTo(o2.getName());
				
			}
			
		});
		
		for(Player test : list3){
			System.out.println(test);
		}
		
	}
	
}


Sonraki Yazı: Vector, Stack
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın