CodeGym /Java Blogu /Rastgele /Java Koleksiyonları sort()
John Squirrels
Seviye
San Francisco

Java Koleksiyonları sort()

grupta yayınlandı
Verilerle uğraşan geliştiriciler olarak ihtiyaç duyduğumuz en yaygın işlevlerden biri sıralamadır - verilerimizi sıralayarak, algoritmalarımızı çok daha hızlı çalışacak şekilde optimize edebilir ve ihtiyaç duyduğu verileri çok daha kısa sürede bulabiliriz. Aksi takdirde alacaktı. Bugünün dersinde Java Collections sort() hakkında konuşacağız. Hızlı bir düşünce deneyi olarak: Bir üniversitenin listesi aracılığıyla bir isim aradığınızı hayal edin. Bu okulda onbinlerce öğrenci olabilir. Size verilen liste alfabetik sırada değilse, aradığınız adı bulana kadar hiçbir yeri atlamadığınızdan emin olmak için her sayfayı tek tek çevirmeniz ve çok dikkatli bakmanız gerekir. Öte yandan, liste alfabetik olarak sıralanmışsa, aramanızda yalnızca daha az titiz olmanız gerekmez, ancak listede aynı baş harfli bölüme kolayca atlayabilir ve aradığınız kişiyi bulana kadar büyük sıçramalarla sayfalar arasında atlamaya devam edebilirsiniz. Ne kadar çok veriyle çalışıyorsanız, onu mümkün olduğunca etkin ve verimli kullanmanız o kadar önemlidir. Bu makalede, Koleksiyonlar sıralama yöntemini kullanarak Java'da (ArrayList dahil) herhangi bir List uygulamasının nasıl sıralanacağını inceleyeceğiz.

Java Koleksiyonları sıralama yöntemini kullanarak bir ArrayList'i Java'da Sıralama

Java Collections.sort yönteminden bahsedelim. Java.util paketi, ArrayList dahil olmak üzere geliştiriciler tarafından sıklıkla kullanılan birçok yararlı yardımcı programı ve paketi içerir. Aşağıdaki basit programa sahip olduğunuzu varsayalım:

import java.util.*;
import java.io.*;
class Main{
     public static void main(String[] args){
          List<String> colors = new ArrayList<String>();
          colors.add("Red    ");
          colors.add("Orange");
          colors.add("Green");
          colors.add("Blue");
    }
}
Renk listesini alfabetik sırayla yazdırabilmek istiyorsunuz. Bunu nasıl yapabilirsin? Java.util.Collections'ı kullanarak sıralama, tek satırlık kadar kolaydır:

Collections.sort(colors);
Ta-da! Renk listeniz artık yerinde sıralanmıştır. Listeyi şu şekilde yazdıracak olsaydınız:

System.out.println(colors);
O zaman aşağıdaki çıktıyı alırsınız:

[Blue, Green, Orange, Red]
Ne kadar kolaydı?! Collections.sort()'u kullanmak, Tamsayılar, Kayanlar veya bu konuyla ilgili diğer herhangi bir basit veri türünü artan düzende sıralamak kadar kolay olacaktır. Peki ya azalan düzende sıralamak isterseniz? Bunun mantıklı olduğu durumlar kesinlikle vardır - belli bir sınıf için test puanlarının bir listesine sahip olduğunuzu ve en çok puan alan öğrencilerin kim olduğunu bulmak istediğinizi hayal edin. Listeyi azalan düzende sıralamak (önce en yüksek puanlar), böylece aradığınız cevapların en üstte olması çok daha mantıklı olacaktır. Neyse ki Collections.sort() öğesinin üzerine isteğe bağlı bir 2. parametre yazılır ve bu da tam olarak bunu yapmanıza olanak tanır:

sort(List l, Comparator c)
Ama karşılaştırıcı nedir? Bir karşılaştırıcı, basitçe iki girişi karşılaştıran ve hangi girişin önce geldiğini gösteren bir sayı döndüren bir fonksiyondur. Bir ArrayList ilkel veri türünü sıralıyorsanız, Java Collections size zaten bir reverseOrder() karşılaştırıcısı sağlar. Bu şekilde çağrılabilir:

Collections.sort(colors, Collections.reverseOrder());
Artık renkler yerinde ters sıralandı, böylece yazdırırsanız aşağıdaki çıktıyı alırsınız:

[Red, Orange, Green, Blue]

Java'da ilkel olmayan veri türlerini sıralamak için Koleksiyonlar nasıl kullanılır?

Şimdiye kadar, Collections.sort() yöntemini kullanarak Java'da dizelerin veya girişlerin ArrayList'lerini sıralamanın bir kod satırı kadar kolay olduğunu gördünüz . Ancak çoğu zaman, Dizi Listeleriniz ilkel olmayan veri türlerini depolayacaktır. Daha karmaşık özniteliklere sahip verilerle çalışırken, bu nesneleri temsil eden sınıflar ve özniteliklerini kullanarak birbirleriyle nasıl karşılaştırılacaklarını yazmak isteyeceksiniz. Bunun bir örneğini keşfetmek için, bir renk listesi sıralama örneğini tekrar ele alalım, ancak bu kez, Dizeleri sıralamak yerine, Renk nesnelerini sıralayacağız. Temel Color sınıfımız şöyle görünebilir:

public class Color{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(String name, int red, int green, int blue){
   	this.name = name;
    	this.r = red;
   	this.g = green;
   	this.b = blue;
	}
}
Color sınıfımızı Collections.sort() ile uyumlu hale getirmek ve Koleksiyonların Color nesnelerini nasıl karşılaştıracağını ve sıralayacağını anlayabilmesi için iki küçük değişiklik yapmamız gerekiyor:
  1. Rengi Karşılaştırılabilir bir nesne yapın (uygulamaları Karşılaştırılabilir<Nesne> ekleyin)
  2. sınıftaki CompareTo yöntemini geçersiz kıl (genel int CompareTo(Object o) geçersiz kıl)
Bu değişikliklerle, sınıfımız artık şöyle görünüyor:

public class Color implements Comparable<Object>{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(int red int green, int blue, String name){
    	this.r = red;
   	this.g = green;
   	this.b = blue;
   	this.name = name;
	}

	@Override
	public int compareTo(Object o) {
    	Color c = (Color) o;
    	return this.name.compareTo(c.name);
	}
}
Color'ın CompareTo yönteminin yalnızca String'in CompareTo yöntemini çağırdığına dikkat edin; sıralama alfabetik sıraya göre yapılacaktır. Örneğin, artan düzende kırmızı değere göre sıralamak istersek, return ifadesini return this.r - cr ile değiştirebiliriz; (Yeşil değere göre azalan düzende sıralamak isteseydik, dönüş cg - this.g; olurdu). Şimdi çağırırsak

Collections.sort(colors);
yalnızca Dizeler yerine Renklerin ArrayList'inde işe yarar çünkü Collections, Color nesnelerini nasıl karşılaştıracağını anlar. Nesnenizin Comparable<Object> uygulamasını yapmak istemiyorsanız, alternatif olarak sınıfınız için bir karşılaştırıcı yazabilir ve bunu 2 parametreli Collections.sort() yöntemine iletebilirsiniz. Karşılaştırıcı, public int Compare(Nesne bir, Nesne iki) yöntemini geçersiz kılar ve Collections.sort() yöntemi, sıralama sırasında nesneleri karşılaştırmak için bunu kullanır. SortByName ve SortByRed karşılaştırıcılarının bir örneği aşağıda uygulanmıştır:

class SortByName implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.name.compareTo(b.name);
	}
}

class SortByRGB implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.r - b.r;
	}
}
Bununla artık arayabilirsiniz

Collections.sort(colors, new SortByName());
Aslında Comparable'ı uygulayan Color sınıfı olmadan ve yine de çalışacaktır. Bazen bunun lambda işlevleri kullanılarak hat içinde yapıldığını göreceksiniz. Bir lambda işlevi, esasen onu çağıran kod satırında tanımlayabileceğiniz isimsiz bir işlevdir. Bir işlevi yalnızca belirli bir örnek için çağırmanız gerektiğinde ve başka bir yerde tamamen ayrı bir işlev tanımlamak istemediğinizde kullanışlıdırlar. SortByName karşılaştırıcısı, aşağıdaki gibi bir lambda işlevi kullanılarak satır içinde tanımlanabilir:

Collections.sort(colors, (a, b)-> {
          return a.name.compareTo(b.name)});
Tahmin edebileceğiniz gibi, (a, b) lambda fonksiyonlarının (karşılaştırılacak iki nesne) parametrelerini temsil eder. ->, aşağıdakilerin bir lambda işlevi tanımı olduğunu belirtir. Hepsi bu kadar! Java'da Collections paketini kullanarak ArrayLists'i sıralamanın en popüler yöntemlerini artık gördünüz.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION