- Konu sahibi
- #1
İlk olarak listenin boş olup olmadığını kontrol edin; ardından Java’da hazır gelen
Aşağıdaki örnek, sayı listesindeki iki değeri bulup ekrana yazdırır:
Bu kodu
Buradaki sonuç, listenin içerdiği değerler arasındaki sınırları gösterir. En küçük değer listenin minimumunu, en büyük değer ise maksimumunu belirtir; listenin ortalamasını veya ikinci en büyük değerini göstermez.
Örneğin yöntem bir değer döndürecekse boş liste için nasıl davranacağını açıkça belirleyebilirsiniz:
Bu örnekte
Boş liste için hata vermek istiyorsanız
Java Stream API kullanıyorsanız
Liste boşsa
Örneğin:
Burada liste boşsa varsayılan bir sayı uydurulmaz; bunun yerine listenin beklenmeyen biçimde boş olduğu bildirilir. Uygulamanın iş kuralına göre
Elinizde
Bu kodda dizi boş olsaydı
Liste sayılardan değil, nesnelerden oluşuyorsa hangi özelliğe göre karşılaştırma yapılacağını belirtmeniz gerekir. Örneğin ürün listesindeki en pahalı ürünü bulmak için ürünün
Bu örnekte karşılaştırılan şey ürün nesnesinin tamamı değil,
Aynı fiyat değerine sahip birden fazla nesne varsa
Listenin tamamında yalnızca minimum ve maksimum değeri arıyorsanız
Seçimden sonra sonucu iş kuralınıza göre yorumlayın. Liste boşsa uygulama bir değer bulmuş sayılmaz. Liste doluysa bulunan değerler yalnızca mevcut öğeler içindeki sınırları gösterir; verilerin eksiksiz, doğru veya güncel olduğunu kanıtlamaz. Örneğin veritabanından eksik kayıt çekilmişse Java doğru biçimde yalnızca kendisine verilen kayıtların en küçük ve en büyük değerlerini hesaplar.
Collections.min() ve Collections.max() metotlarını kullanın. Örneğin List<Integer> sayilar = List.of(12, 5, 27, 3, 18); listesinde en küçük değer 3, en büyük değer 27 olur. Liste boşsa bu metotlar sonuç üretemez ve NoSuchElementException oluşabileceği için boş liste durumu ayrıca ele alınmalıdır.() ve () ile değerleri bulma
Collections.min(liste) listedeki en küçük öğeyi, Collections.max(liste) ise en büyük öğeyi döndürür. Metotlar, öğelerin karşılaştırılabilir olmasını bekler. Integer, Double ve String gibi yaygın türler bu karşılaştırmayı doğal sıralarına göre yapabilir.Aşağıdaki örnek, sayı listesindeki iki değeri bulup ekrana yazdırır:
Java:
import java.util.Collections;
import java.util.List;
public class ListeMinMax {
public static void main(String[] args) {
List<Integer> sayilar = List.of(12, 5, 27, 3, 18);
if (sayilar.isEmpty()) {
System.out.println("Liste boş.");
return;
}
int enKucuk = Collections.min(sayilar);
int enBuyuk = Collections.max(sayilar);
System.out.println("En küçük değer: " + enKucuk);
System.out.println("En büyük değer: " + enBuyuk);
}
}
Bu kodu
ListeMinMax.java adıyla kaydedip Java geliştirme ortamınızda veya terminalde çalıştırabilirsiniz. Beklenen çıktı şöyledir:
Kod:
En küçük değer: 3
En büyük değer: 27
Buradaki sonuç, listenin içerdiği değerler arasındaki sınırları gösterir. En küçük değer listenin minimumunu, en büyük değer ise maksimumunu belirtir; listenin ortalamasını veya ikinci en büyük değerini göstermez.
Boş listeyi mutlaka kontrol edin
Collections.min() ve Collections.max() metotları en az bir öğe bulunan listelerde kullanılmalıdır. Liste boşsa karşılaştırılacak bir değer bulunmadığı için işlem tamamlanamaz. Bu nedenle dışarıdan gelen verilerde, veritabanı sorgularında veya kullanıcı girdilerinde önce isEmpty() ya da size() == 0 kontrolü yapılmalıdır.Örneğin yöntem bir değer döndürecekse boş liste için nasıl davranacağını açıkça belirleyebilirsiniz:
Java:
import java.util.Collections;
import java.util.List;
public static Integer enKucukDegeriBul(List<Integer> sayilar) {
if (sayilar == null || sayilar.isEmpty()) {
return null;
}
return Collections.min(sayilar);
}
Bu örnekte
null veya boş liste geldiğinde null döndürülür. Çağıran kodun bu durumu kontrol etmesi gerekir; aksi hâlde dönen değeri doğrudan int değişkenine atamak veya üzerinde işlem yapmak yeni bir hata oluşturabilir.Boş liste için hata vermek istiyorsanız
IllegalArgumentException da kullanabilirsiniz. Bu tercih, listenin boş olmasının program açısından geçersiz bir durum olup olmamasına bağlıdır. Veri bulunmaması normal bir ihtimalse Optional veya null sonucu değerlendirilebilir; veri mutlaka bulunmalıysa hata fırlatmak daha açık olabilir.Akış içinde minimum ve maksimum değeri bulma
Java Stream API kullanıyorsanız
min() ve max() metotları Optional döndürür. Optional, sonucun bulunmayabileceğini açıkça ifade eder; bu nedenle boş liste durumu daha görünür hâle gelir.
Java:
import java.util.List;
public class StreamMinMax {
public static void main(String[] args) {
List<Integer> sayilar = List.of(12, 5, 27, 3, 18);
sayilar.stream()
.min(Integer::compareTo)
.ifPresent(enKucuk ->
System.out.println("En küçük değer: " + enKucuk));
sayilar.stream()
.max(Integer::compareTo)
.ifPresent(enBuyuk ->
System.out.println("En büyük değer: " + enBuyuk));
}
}
Liste boşsa
ifPresent() içindeki kod çalışmaz. Bu yaklaşım, yalnızca sonuç bulunduğunda işlem yapmak için uygundur. Sonucun mutlaka alınması gerekiyorsa orElse() ile varsayılan değer verebilir veya orElseThrow() ile açık bir hata oluşturabilirsiniz.Örneğin:
Java:
int enBuyuk = sayilar.stream()
.max(Integer::compareTo)
.orElseThrow(() ->
new IllegalArgumentException("Liste boş olamaz"));
Burada liste boşsa varsayılan bir sayı uydurulmaz; bunun yerine listenin beklenmeyen biçimde boş olduğu bildirilir. Uygulamanın iş kuralına göre
orElse(0) gibi bir varsayılan değer de seçilebilir, ancak 0 değerinin gerçekten anlamlı bir varsayılan olduğundan emin olmadan bunu kullanmayın. Aksi hâlde gerçek veride bulunmayan bir değer, hesaplamayı yanıltabilir.Dizilerde minimum ve maksimum değer
Elinizde
int[] gibi bir dizi varsa Arrays.stream() ile akış oluşturabilirsiniz. Dizi boşsa min() ve max() sonucu OptionalInt olarak döner.
Java:
import java.util.Arrays;
public class DiziMinMax {
public static void main(String[] args) {
int[] sayilar = {12, 5, 27, 3, 18};
int enKucuk = Arrays.stream(sayilar)
.min()
.orElseThrow();
int enBuyuk = Arrays.stream(sayilar)
.max()
.orElseThrow();
System.out.println("En küçük değer: " + enKucuk);
System.out.println("En büyük değer: " + enBuyuk);
}
}
Bu kodda dizi boş olsaydı
orElseThrow() hata oluştururdu. Boş dizi geçerli bir durumsa önce sayilar.length == 0 kontrolü yapmalı veya isPresent() ile OptionalInt sonucunu değerlendirmelisiniz.Nesne listesindeki alana göre arama
Liste sayılardan değil, nesnelerden oluşuyorsa hangi özelliğe göre karşılaştırma yapılacağını belirtmeniz gerekir. Örneğin ürün listesindeki en pahalı ürünü bulmak için ürünün
fiyat alanını karşılaştırabilirsiniz.
Java:
import java.math.BigDecimal;
import java.util.Comparator;
import java.util.List;
record Urun(String ad, BigDecimal fiyat) {}
public class UrunMinMax {
public static void main(String[] args) {
List<Urun> urunler = List.of(
new Urun("Klavye", new BigDecimal("850")),
new Urun("Fare", new BigDecimal("475")),
new Urun("Monitör", new BigDecimal("6200"))
);
Urun enUcuz = urunler.stream()
.min(Comparator.comparing(Urun::fiyat))
.orElseThrow();
Urun enPahali = urunler.stream()
.max(Comparator.comparing(Urun::fiyat))
.orElseThrow();
System.out.println("En ucuz ürün: " + enUcuz.ad());
System.out.println("En pahalı ürün: " + enPahali.ad());
}
}
Bu örnekte karşılaştırılan şey ürün nesnesinin tamamı değil,
fiyat alanıdır. Sonuç olarak en ucuz ürün Fare, en pahalı ürün Monitör olur. Fiyatlar BigDecimal ile tutulduğu için para hesabında kayan noktalı türlerin yuvarlama sorunlarından kaçınmak daha kolaydır.Aynı fiyat değerine sahip birden fazla nesne varsa
min() veya max() tek bir nesne döndürür. Eşit fiyatlı bütün ürünleri bulmak istiyorsanız önce minimum veya maksimum fiyatı hesaplayıp ardından o fiyata eşit nesneleri filtrelemeniz gerekir. Tek bir sonuç, eşit durumdaki tüm kayıtların döndürüldüğü anlamına gelmez.Hangi yöntemi seçmelisiniz?
Listenin tamamında yalnızca minimum ve maksimum değeri arıyorsanız
Collections.min() ve Collections.max() doğrudan ve okunabilir çözümdür. Akış içinde başka filtreleme veya dönüştürme işlemleri de yapıyorsanız Stream API daha uygun olabilir. Nesne listesindeyse Comparator.comparing() ile karşılaştırılacak alanı belirtmelisiniz.| Veri türü veya ihtiyaç | Uygun yaklaşım |
|---|---|
| Dolu bir sayı listesi | Collections.min() ve Collections.max() |
| Boş liste ihtimali olan akış | Stream min() ve max() ile Optional sonucu |
| Dizi | Arrays.stream() üzerinden min() ve max() |
| Nesne listesi | Comparator.comparing() ile ilgili alanı karşılaştırma |
Sık sorulan sorular
() ve () boş listede ne döndürür?
Boş liste karşılaştırılacak öğe içermediği için bu metotlar normal bir minimum veya maksimum değer döndüremez. Bu nedenle listeyi önce kontrol edin veya Stream API ile dönen
Optional sonucunu değerlendirin.Listede aynı en küçük veya en büyük değerden birden fazla varsa hepsi bulunur mu?
Hayır.
min() ve max() tek bir değer döndürür. Eşit olan tüm öğeleri bulmanız gerekiyorsa önce sınır değerini hesaplayıp listeyi bu değere göre filtrelemelisiniz.String listesinin en büyük ve en küçük değeri nasıl belirlenir?
Collections.min() ve Collections.max() metotları String değerlerini doğal sözlük sırasına göre karşılaştırır. Bu sıra sayısal büyüklük anlamına gelmez. Örneğin "10" ve "2" metin olarak karşılaştırıldığında beklediğiniz sayısal sonuç oluşmayabilir; sayıları önce uygun bir sayısal türe dönüştürün.