Arama butonu
Bu konudaki kullanıcılar: 1 misafir
4
Cevap
960
Tıklama
0
Öne Çıkarma
Java HashTable ' da sıralama sıkıntısı
K
9 yıl
Çavuş
Konu Sahibi

Merhabalar

Arkadaşlar bir ödevim var. Ancak bir sorun yaşıyorum. Öncelikle size kodları atayım.

Urunler.class kodları
 

package veriyapilari;

public class Urunler {

public String barkod;
public String adi;
public int adet;
public float fiyat;

public Urunler(String barkod , String adi , int adet , float fiyat){
this.barkod = barkod;
this.adi = adi;
this.adet = adet;
this.fiyat = fiyat;

}

}




StokTakib.class kodları
 
package veriyapilari;

import java.util.Hashtable;
import java.util.Scanner;
import java.util.Iterator;
import java.util.Collection;


//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

Urunler bakkal = new Urunler("141816044" , "Burak" , 15 , 150);
Urunler bakkal2 = new Urunler("141816045" , "Burak2" , 150 , 1500);

stk.put(bakkal.barkod, bakkal.adi);
stkadt.put(bakkal.adet, bakkal.fiyat);

stk.put(bakkal2.barkod, bakkal2.adi);
stkadt.put(bakkal2.adet, bakkal2.fiyat);

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...\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.");

System.out.println("Seçiminizi giriniz : ");
secim = klavye.nextInt();

Collection barkodlar = stk.keySet();
Iterator it = barkodlar.iterator();

Collection adlar = stk.values();
Iterator ittir = adlar.iterator();

Collection adetler = stkadt.keySet();
Iterator ittirme = adetler.iterator();


switch(secim){
case 1 :



System.out.println("\n\nKaç adet ürün eklemek istiyorsunuz ?");
kere = klavye.nextInt();
i=0;
do{

System.out.println("Stoka eklenecek ürünün barkod nosunu giriniz : ");
bark=klavye.next();

System.out.println("Stoka eklenecek ürünün adını giriniz : ");
ad=klavye.next();

System.out.println("Stoka eklenecek ürünün adetini giriniz : ");
adet=klavye.nextInt();

System.out.println("Stoka eklenecek ürünün fiyatını giriniz : ");
fiyat=klavye.nextFloat();

System.out.println("Ürününüz başarıyla eklenmiştir ... \n\n");

Urunler bakkal1 = new Urunler(bark , ad , adet , fiyat);

stk.put(bakkal1.barkod, bakkal1.adi);
stkadt.put(bakkal1.adet,bakkal1.fiyat);

i++;

}while(i<kere); break;

case 2 :



String sil;
System.out.println("\n\nSilmek istediğiniz ürünün barkod nosunu giriniz : ");
sil = klavye.next();
barkodlar.remove(sil); break;

case 4 :


System.out.printf("%s\t\t%s\t%s\n","ürün barkodu","ürün adı","ürün adedi\n");

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.

Üye Ol Şimdi Değil



M
9 yıl
Yarbay

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.



< Bu ileti mobil sürüm kullanılarak atıldı >

K
9 yıl
Çavuş
Konu Sahibi

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 :(

Bu sorunu nasıl çözerim ?


Bu mesaja 1 cevap geldi.
M
9 yıl
Yarbay

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();
}

@Override
public String toString() {
return "Urunler{" +
"adi='" + adi + '\'' +
", adet=" + adet +
", fiyat=" + fiyat +
", barkod='" + barkod + '\'' +
'}';
}

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.");

System.out.println("Seçiminizi giriniz : ");
secim = klavye.nextInt();


switch (secim) {
case 1:


System.out.println("

Kaç adet ürün eklemek istiyorsunuz ?");
kere = klavye.nextInt();
i = 0;
do {

System.out.println("Stoka eklenecek ürünün barkod nosunu giriniz : ");
bark = klavye.next();

System.out.println("Stoka eklenecek ürünün adını giriniz : ");
ad = klavye.next();

System.out.println("Stoka eklenecek ürünün adetini giriniz : ");
adet = klavye.nextInt();

System.out.println("Stoka eklenecek ürünün fiyatını giriniz : ");
fiyat = klavye.nextFloat();

System.out.println("Ürününüz başarıyla eklenmiştir ...

");

Urunler bakkal1 = new Urunler(bark, ad, adet, fiyat);

urunEkle(bakkal1);

i++;

} while (i < kere);
break;

case 2:


String sil;
System.out.println("

Silmek istediğiniz ürünün barkod nosunu giriniz : ");
sil = klavye.next();
urunSil(sil);
break;

case 4:


System.out.printf("%s\t\t%s\t%s
", "ürün barkodu", "ürün adı", "ürün adedi
");

for (Urunler urunler : tumUrunler) {
System.out.printf(urunler.barkod + "\t\t" + urunler.adi + "\t\t" + urunler.adet + "

");
}
// while (it.hasNext()) {
// System.out.printf(it.next() + "\t\t" + ittir.next() + "\t\t" + ittirme.next() + "

");
// }
break;


}

System.out.println("

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(Urunler urun) {
if (barkodToUrunMap.containsKey(urun.barkod)) {
barkodToUrunMap.remove(urun.barkod);
tumUrunler.remove(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 : )





< Bu mesaj bu kişi tarafından değiştirildi Mephalay -- 14 Aralık 2016; 11:56:35 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @kaiserstudents
K
9 yıl
Çavuş
Konu Sahibi

Çok teşekkür ederim çok iyi oldu bu




Bu mesajda bahsedilenler: @Mephalay
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.