Urunler class ini degistirdim oncelikle. Barkod unique oldugu icin ona gore hash edilecek. equals ve hash metodlari kesinlikle gerekli, toString ben seviyorum diye ekledim.
/** * Created by Mephalay on 12/14/2016. */ public class Urunler {
public String barkod; public String adi; public int adet; public float fiyat;
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false;
Urunler urunler = (Urunler) o;
return barkod.equals(urunler.barkod);
}
@Override public int hashCode() { return barkod.hashCode(); }
public Urunler(String barkod , String adi , int adet , float fiyat){ this.barkod = barkod; this.adi = adi; this.adet = adet; this.fiyat = fiyat;
}
}
Bir suru farkli Collection ve HashTable structure i kullanmak zor. Bunun yerine, barkod->urun map'lemesi yapan bir HashMap ve tum urunlerin sirali sekilde listesini tutan bir ArrayList yeterli. Bir de tum kodu main metodda yazmissin. Biraz onu da degistirdim.
/** * Created by Mephalay on 12/14/2016. */ public class StokTakib { private static Map<String, Urunler> barkodToUrunMap = new HashMap<>(); private static List<Urunler> tumUrunler = new ArrayList<>();
public static void main(String[] args) {
Urunler bakkal = new Urunler("141816044", "Burak", 15, 150); Urunler bakkal2 = new Urunler("141816045", "Burak2", 150, 1500);
urunEkle(bakkal); urunEkle(bakkal2);
Scanner klavye = new Scanner(System.in);
int i = 0; String bark; String ad; int adet; float fiyat; int alarm_siniri; int kere; int secim; char cevap = 'h';
System.out.printf("\t\t%s", "Merhaba Stok takip programını kullanmaktasınız... "); do {
System.out.printf("%s ", "Lütfen yapmak istediğiniz işlemi seçiniz."); System.out.printf(" %s %s %s %s %s
", "1 . Ürün eklemek için 1 ' e basınız.", "2 . Ürün silmek için 2 ' ye basınız.", "3 . Herhangi bir ürünün bilgilerini listelemek için 3 ' e basınız.", "4 . Tüm ürünlerin dökümüne ulaşmak için 4 ' e basınız.", "5 . Bir ürünün tanımını veya fiyatını güncellemek için 5' e basınız.");
Devam etmek istiyor musunuz ? (e/h) "); cevap = klavye.next().charAt(0);
} while (cevap == 'e'); }
private static void urunEkle(Urunler urun) { if (barkodToUrunMap.containsKey(urun.barkod)) throw new IllegalArgumentException("Barkod daha once eklenmistir!"); barkodToUrunMap.put(urun.barkod, urun); tumUrunler.add(urun); }
private static void urunSil(String barkod) { if (barkodToUrunMap.containsKey(barkod)) { barkodToUrunMap.remove(barkod); Iterator<Urunler> urunIterator = tumUrunler.iterator(); while (urunIterator.hasNext()) { Urunler next = urunIterator.next(); if (next.barkod.equals(barkod)) urunIterator.remove(); } } } }
urunEkle ve urunSil diye 2 tane metod ekledim. Cunku her yeni urun eklendiginde listeye ve map'e ayni anda ekleyip cikaracagiz. Bunlari tek bir yerde topladim. Bir de kullanici urun eklerken ayni barkodu tekrar girerse hata vermeli. Ben Exception throw ettim ama dogrusu adama uyari vermek. Eger bu bir odev ise hoca bunu deneyebilir, ben olsam denerdim. Diger farkliliklari da sen kesfedeceksindir : )
//BARKOD NO , ÜRÜN ADI , STOK ADEDİ , MİNİMUM ALARM ADEDİ
public class StokTakib { public static void main(String[] args){
Hashtable stk = new Hashtable(); //barkod ile ürün adını alacağımız hash tablemız Hashtable stkadt = new Hashtable(); //ürün adedi ile ürün alarm adedini alacağımız hash tablemız
int i = 0; String bark; String ad; int adet; float fiyat; int alarm_siniri; int kere; int secim; char cevap = 'h';
System.out.printf("\t\t%s","Merhaba Stok takip programını kullanmaktasınız...\n"); do{
System.out.printf("%s\n","Lütfen yapmak istediğiniz işlemi seçiniz."); System.out.printf("\n%s\n%s\n%s\n%s\n%s\n\n","1 . Ürün eklemek için 1 ' e basınız.","2 . Ürün silmek için 2 ' ye basınız.", "3 . Herhangi bir ürünün bilgilerini listelemek için 3 ' e basınız.","4 . Tüm ürünlerin dökümüne ulaşmak için 4 ' e basınız.", "5 . Bir ürünün tanımını veya fiyatını güncellemek için 5' e basınız.");
while (it.hasNext()){ System.out.printf(it.next()+"\t\t"+ittir.next()+"\t\t"+ittirme.next()+"\n\n"); } break;
}
System.out.println("\n\nDevam etmek istiyor musunuz ? (e/h) "); cevap = klavye.next().charAt(0);
}while(cevap == 'e'); } }
Gördüğünüz üzere iki ayrı hashtable açmaktayım. stk hashtable'ına barkod ile ürün adını stkadt hashtable'na adet ile fiyat almaktayım. Ancak yazdırırken stk hashtable'ı sıralı bir şekilde yazdırılırken stkadt hashtable'ı malesef sırasız bir şekilde yazdırılmakta. Bu konuda biraz acemiyim . Yardımlarınızı bekliyorum.
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.
Ordered data strucure kullanman gerek insert ettigin sira ile almak istiyorsa iterate ederken. Ama javada bir isi halletmek icin cok fazla map kullaniyorsan yanlis yoldasin demektir, cunku bir class yazip ilgili ozellikleri class icerisine yazabilirsin. Oyle daha temiz olur. Simdi mobildeyim birazdan kodu degistirip buraya yazicam.
Cevabınız için teşekkür ederim. Sanırım sıralama sorununu LinkedHashMap kullanarak neredeyse çözdüm. Ancak bu seferde şöyle bir sorun oluşmakta. Barkod ve ad alan LinkedHashMap ile adet ve fiyat alan LinkedHashMap birbirinden bağımsız olduğu için bir barkodu remove ettiğimde malesefadeti ve fiyatı silinmiyor. Böylece ürünleri listelediğimde bir yerden sonra ürünlerin adetleri silinmeyen adet map'i nedeniyle yanlış gözüküyor.
silinmeden önce Burak 15 Burak2 20 Burak3 25 diyelim.
ben en üstteki barkodu sildiğimde Burak2 15 Burak3 20 olarak gözükmekte :(
Bir suru farkli Collection ve HashTable structure i kullanmak zor. Bunun yerine, barkod->urun map'lemesi yapan bir HashMap ve tum urunlerin sirali sekilde listesini tutan bir ArrayList yeterli.
Bir de tum kodu main metodda yazmissin. Biraz onu da degistirdim.
urunEkle ve urunSil diye 2 tane metod ekledim. Cunku her yeni urun eklendiginde listeye ve map'e ayni anda ekleyip cikaracagiz. Bunlari tek bir yerde topladim.
Bir de kullanici urun eklerken ayni barkodu tekrar girerse hata vermeli. Ben Exception throw ettim ama dogrusu adama uyari vermek. Eger bu bir odev ise hoca bunu deneyebilir, ben olsam denerdim.
Diger farkliliklari da sen kesfedeceksindir : )
< Bu mesaj bu kişi tarafından değiştirildi Mephalay -- 14 Aralık 2016; 11:56:35 >
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesajda bahsedilenler: @kaiserstudents