Ticker

6/random/ticker-posts

Java TXT Dosyayı Satır Satır Okuma

Java ödevlerinde genelde input verisi txt dosyası aracılığıyla verilir. Txt dosyada her satırda aralarında boşluk, virgül vb bir özel karakter ile ayrılan farklı değerleri de ayrı ayrı okuyup Java nesnelerine atamak gerekebilir. Bu yazımızda basitçe bir txt dosyayı satır satır okuyup her satırdaki değerleri de özel karaktere göre ayırıp kullanmayı göreceğiz.

Java BufferedReader TXT
Java BufferedReader TXT


Kim En Çok Harçlık Toplamış?

Bir bayram günü çocukların topladıkları harçlık miktarları input.txt isimli bir dosyada tanımlı olsun. input.txt dosyasını satır satır okuyup, her çocuğun toplam ne kadar harçlık topladığını hesaplayın. Konsola en çok harçlık toplayandan en az toplayana doğru sıralı olarak yazdırın. input.txt dosyasında her satırda önce çocuğun adı sonra aralarında bir boşluk olacak şekilde topladığı harçlık miktarları sıralı olacaktır.

Bu şekilde basit bir Java ödevi tanımlayalım ve ödevi çözmeye çalışalım.

Aşağıdaki gibi bir input.txt dosyası input olarak verilsin.

Mehmet 100 25 40 70 60
Hasan 80 60 70 30 10
Ahmet 50 80 60 80 140

Çocuk verisini aşağıdaki gibi tanımladığımız bir Child.java sınıfı ile tutalım.

public class Child {

	private String name;
	
	private int totalMoney;

	public String getName() {
		return name;
	}

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

	public int getTotalMoney() {
		return totalMoney;
	}

	public void setTotalMoney(int totalMoney) {
		this.totalMoney = totalMoney;
	}
	
}

Çözüm Java kodunu da şu şekilde bir sınıf ile tanımlayabiliriz.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class JavaTxtDosyaOkuma {

	public static void main(String[] args) throws IOException {

		try (BufferedReader bufferedReader = new BufferedReader(new FileReader("input.txt"))) {

			String line = null;

			String specialCharacter = " ";

			List<Child> children = new ArrayList<>();

			while ((line = bufferedReader.readLine()) != null) {

				System.out.println(line);

				String[] values = line.split(specialCharacter);

				Child child = new Child();

				child.setName(values[0]);

				int totalMoney = 0;

				for (int i = 1; i < values.length; i++) {

					Integer money = Integer.valueOf(values[i]);

					totalMoney += money;

				}

				child.setTotalMoney(totalMoney);

				children.add(child);

			}

			Comparator<Child> childComparator = new Comparator<Child>() {

				@Override
				public int compare(Child o1, Child o2) {

					return Integer.compare(o2.getTotalMoney(), o1.getTotalMoney());
				}
			};

			children.sort(childComparator);

			System.out.println("Sonuç:");

			for (Child child : children) {

				System.out.println(child.getName() + " toplam: " + child.getTotalMoney());
			}

		}
	}

}

Şimdi parça parça çözümü inceleyelim. Öncelikle dosyayı okumak için bir java.io.BufferedReader nesnesi tanımlıyoruz. Memoryleak olmaması için try bloğu içinde tanımlıyoruz ve otomatik olarak close çağrılmasını sağlıyoruz.

try (BufferedReader bufferedReader = new BufferedReader(new FileReader("input.txt"))) {

bufferedReader.readLine() metodu ile satır satır dosyayı okuyoruz. Gelen satırı da tanımladığımız özel karakteri parametre vererek split() metodunu kullanarak parçalara ayırıyoruz. Özel karakterimiz boşluk olduğu için, sonuç olarak çocuğun adını ve harçlık miktarlarını içeren bir String array elde ediyoruz.

while ((line = bufferedReader.readLine()) != null) {
	System.out.println(line);

String[] values = line.split(specialCharacter);

Bu array'in ilk elemanını çocuğun ismi olarak atıyoruz. Daha sonra array'de geriye kalan değerleri Integer sınıfını kullanarak integer değere çeviriyoruz ve topluyoruz. Toplam değeri de child nesnesine atıyoruz. En son olarak da children listesine child nesnemizi ekliyoruz.

Child child = new Child();

child.setName(values[0]);

int totalMoney = 0;

for (int i = 1; i < values.length; i++) {

	Integer money = Integer.valueOf(values[i]);

	totalMoney += money;

}

child.setTotalMoney(totalMoney);

children.add(child);

Dosya okuma bittikten sonra listeyi toplam harçlık miktarına göre sıralamamız gerekiyor. Bunun için bir java.util.Comparator nesnesi tanımlıyoruz ve children isimli java.util.List nesnemizin sort() metoduna parametre olarak veriyoruz.

Comparator<Child> childComparator = new Comparator<Child>() {

	@Override
	public int compare(Child o1, Child o2) {

		return Integer.compare(o2.getTotalMoney(), o1.getTotalMoney());
	}
};

children.sort(childComparator);

En son olarak da sonucu konsola yazmamız gerekiyor. Listeyi büyükten küçüğe sıraladığımız için for each yapısı ile yazdırmamız yeterli olacaktır.

System.out.println("Sonuç:");

for (Child child : children) {

	System.out.println(child.getName() + " toplam: " + child.getTotalMoney());
}

Dosyayı çalıştırdığımızda konsoldaki sonuç aşağıdaki gibi olacaktır:

>

Mehmet 100 25 40 70 60
Hasan 80 60 70 30 10
Ahmet 50 80 60 80 140
Sonuç:
Ahmet toplam: 410
Mehmet toplam: 295
Hasan toplam: 250

BufferedReader ödev konsol çıktısı
BufferedReader ödev konsol çıktısı

Yorum Gönder

0 Yorumlar