Barış

WFN Üye
Konular
547
Mesajlar
547
Çözüm
0
Ticaret Puanı
0
Üyelik
23 Gün
Konum
Kastamonu
Web Sitesi
Var
Alanı
Google ADS
1/1
Konu sahibi
İlk olarak listenin boş olup olmadığını kontrol edin; ardından Java’da hazır gelen 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ı listesiCollections.min() ve Collections.max()
Boş liste ihtimali olan akışStream min() ve max() ile Optional sonucu
DiziArrays.stream() üzerinden min() ve max()
Nesne listesiComparator.comparing() ile ilgili alanı karşılaştırma
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.

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.

Listeyi sıralamak minimum ve maksimum değeri bulmak için gerekli mi?​

Hayır. Listeyi yalnızca minimum ve maksimumu bulmak için sıralamak gerekmez. min() ve max() doğrudan karşılaştırma yapar; sıralama ancak listenin tamamını sıralı biçimde kullanmanız gerekiyorsa anlamlıdır.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic