Şimdi Ara

Java HashTable ' da sıralama sıkıntısı

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
5
Cevap
0
Favori
866
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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.







  • 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ı >
  • 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 ?
  • kaiserstudents kullanıcısına yanıt
    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 >




  • Mephalay M kullanıcısına yanıt
    Çok teşekkür ederim çok iyi oldu bu
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.