Java

Член од
28 мај 2008
Мислења
3.966
Поени од реакции
4.073
Здраво дечки, задачкава е со хеш, ама по се изгледа hashCode() не ми го зима и покрај тоа што ми е override-нато, т.е си ги сместува елементите во хешот со помош на default-ното, а сакам со моја hashCode() која се наоѓа во класата Lekche, ама не ги внесува. Некој идеа? во прилог цела задача
Код:
package lekovi;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class SLLNode<E> {
    protected E element;
    protected SLLNode<E> succ;

    public SLLNode(E elem, SLLNode<E> succ) {
        this.element = elem;
        this.succ = succ;
    }

    @Override
    public String toString() {
        return element.toString();
    }
}

class MapEntry<K extends Comparable<K>, E> implements Comparable<K> {

    // Each MapEntry object is a pair consisting of a key (a Comparable
    // object) and a value (an arbitrary object).
    K key;
    E value;

    public MapEntry(K key, E val) {
        this.key = key;
        this.value = val;
    }

    public int compareTo(K that) {
        // Compare this map entry to that map entry.
        @SuppressWarnings("unchecked")
        MapEntry<K, E> other = (MapEntry<K, E>) that;
        return this.key.compareTo(other.key);
    }

    public String toString() {
        return "<" + key + "," + value + ">";
    }
}

class CBHT<K extends Comparable<K>, E> {

    // An object of class CBHT is a closed-bucket hash table, containing
    // entries of class MapEntry.
    private SLLNode<MapEntry<K, E>>[] buckets;

    @SuppressWarnings("unchecked")
    public CBHT(int m) {
        // Construct an empty CBHT with m buckets.
        buckets = (SLLNode<MapEntry<K, E>>[]) new SLLNode[m];
    }

    private int hash(K key) {
        // Translate key to an index of the array buckets.
        return Math.abs(key.hashCode()) % buckets.length;

    }

    public SLLNode<MapEntry<K, E>> search(K targetKey) {
        // Find which if any node of this CBHT contains an entry whose key is
        // equal
        // to targetKey. Return a link to that node (or null if there is none).
        int b = hash(targetKey);
        for (SLLNode<MapEntry<K, E>> curr = buckets[b]; curr != null; curr = curr.succ) {
            if (targetKey.equals(((MapEntry<K, E>) curr.element).key))
                return curr;
        }
        return null;
    }

    public void insert(K key, E val) { // Insert the entry <key, val> into this
                                        // CBHT.
        System.out.println("Insert begin");
        MapEntry<K, E> newEntry = new MapEntry<K, E>(key, val);
        int b = hash(key);
        for (SLLNode<MapEntry<K, E>> curr = buckets[b]; curr != null; curr = curr.succ) {
            if (key.equals(((MapEntry<K, E>) curr.element).key)) {
                // Make newEntry replace the existing entry ...
                curr.element = newEntry;
                return;
            }
        }
        // Insert newEntry at the front of the 1WLL in bucket b ...
        buckets[b] = new SLLNode<MapEntry<K, E>>(newEntry, buckets[b]);
        System.out.println("Insert end");
    }

    public void delete(K key) {
        // Delete the entry (if any) whose key is equal to key from this CBHT.
        int b = hash(key);
        for (SLLNode<MapEntry<K, E>> pred = null, curr = buckets[b]; curr != null; pred = curr, curr = curr.succ) {
            if (key.equals(((MapEntry<K, E>) curr.element).key)) {
                if (pred == null)
                    buckets[b] = curr.succ;
                else
                    pred.succ = curr.succ;
                return;
            }
        }
    }

    public String toString() {
        String temp = "";
        for (int i = 0; i < buckets.length; i++) {
            temp += i + ":";
            for (SLLNode<MapEntry<K, E>> curr = buckets[i]; curr != null; curr = curr.succ) {
                temp += curr.element.toString() + " ";
            }
            temp += "\n";
        }
        return temp;
    }

}

class Lekche implements Comparable<Lekche> {

    public String ime;
    public int pozitivnaLista;
    public int cena;
    public int kolicina;

    public Lekche(String ime, int pozitivnaLista, int cena, int kolicina) {
        this.ime = ime;
        this.pozitivnaLista = pozitivnaLista;
        this.cena = cena;
        this.kolicina = kolicina;
    }

    public Lekche(String ime) {
        super();
        this.ime = ime;
    }

    @Override
    public int hashCode() {
        System.out.println("hashCode from Lekche");
        int hash = 0;
        for (int i = 0; i < ime.length(); i++)
            hash += 7 * 31 + ime.charAt(i);

        return hash;
    }

    public boolean equals(Object obj) {
        Lekche lek = (Lekche) obj;

        return ime.equals(lek.ime);

    }

    public void presmetaj(int kolic) {
        if (kolic <= kolicina) {
            kolicina = kolicina - kolic;
            System.out.println("Napravena e naracka");
        } else {

            System.out.println("Nema dovolno lekovi");
        }

    }

    @Override
    public int compareTo(Lekche o) {
        return this.ime.compareTo(o.ime);
    }
}

public class Lekovi {

    /**
     * @param args
     *            the command line arguments
     * @throws InterruptedException
     */
    public static void main(String[] args) throws IOException,
            InterruptedException {
        // TODO code application logic here

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String ime;
        int kolicina;
        int N = 10;// /Integer.parseInt(br.readLine());

        CBHT<Lekche, Lekche> tabela = new CBHT<Lekche, Lekche>(N * 2);

        for (int i = 0; i < N; i++) {
            String[] niza = new String[] { "lek" + i, "1", "1", "1" };// br.readLine().split(" ");

            Lekche val = new Lekche(niza[0], Integer.parseInt(niza[1]),
                    Integer.parseInt(niza[2]), Integer.parseInt(niza[3]));
            tabela.insert(val, val);

        }
        // System.out.println(tabela);
        int i = 0;
        while (true) {
            ime = "lek" + i;// br.readLine();
            if (i == 20)
                ime = "KRAJ";
            if (ime.matches("KRAJ"))
                break;
            kolicina = 1;// Integer.parseInt(br.readLine());

            SLLNode<MapEntry<Lekche, Lekche>> l = tabela
                    .search(new Lekche(ime));

            if (l == null)
                System.out.println("Ne postoi takov lek");
            else {

                Lekche lek = l.element.value;

                lek.presmetaj(kolicina);

                System.out
                        .println("od lekot: " + lek.ime
                                + " ima preostanato uste " + lek.kolicina
                                + " kolicina");
            }
            Thread.currentThread().sleep(2000);
            i++;
        }

    }

}
Поправено, проблемот е во декларацијата на HashMap-ата, key-то треба да биде Lekche, бидејќи сакаш да го користиш неговиот метод за хаширање.
1. int b = hash(key);
2. Math.abs(key.hashCode()) % buckets.length;
Во првиот чекор бараш хаширање на key-то и во вториот се извршува. Бидејќи тебе key-то ти е декларирано како String, се повикува hashCode од класата String, a не од Lekche.
 

Have an ice day

Get Free
Член од
26 јануари 2014
Мислења
544
Поени од реакции
1.021
Поправено, проблемот е во декларацијата на HashMap-ата, key-то треба да биде Lekche, бидејќи сакаш да го користиш неговиот метод за хаширање.
1. int b = hash(key);
2. Math.abs(key.hashCode()) % buckets.length;
Во првиот чекор бараш хаширање на key-то и во вториот се извршува. Бидејќи тебе key-то ти е декларирано како String, се повикува hashCode од класата String, a не од Lekche.
Конечно работи. Знам ми работеа овие со хеш функција, ама поради тоа што сум ги ставал класите како клуч, а вредноста како стринг. Не ми текна дека баш клучот одлучува каде ќе се смести во табелата :facepalm:.
Значи, секогаш мора преку класа да биде клучот за да работи нашиот хеш код (заменет), освен ако не го преоптовариме хеш кодот во стринг класата доколку клучот е стринг.
Инаку, фала ти многу за помошта (y).
 
Член од
28 мај 2008
Мислења
3.966
Поени од реакции
4.073
Значи, секогаш мора преку класа да биде клучот за да работи нашиот хеш код (заменет), освен ако не го преоптовариме хеш кодот во стринг класата доколку клучот е стринг.
Класата String е final што значи нема да можеш да ја наследиш, a со тоа и да го Overrid-уваш методот :)
 

Have an ice day

Get Free
Член од
26 јануари 2014
Мислења
544
Поени од реакции
1.021
Пак јас, имам еден проблем со јава I/O. Немам никакви материјали поврзани со RandomAccessFile а исто и на нет многу слабо е објаснето па морав да пишам тука. Проблемот во продолжение:
Код:
Напишете ги следните методи кои работат со бинарната датотека db.dat. Оваа датотека содржи типови на податоци со фиксна големина од 16 бајти. Се претпоставува дека датотеката може да биде многу голема (мерена во гигабајти). Влез/излез операциите да се имплементираат со помош на RandomAccessFile.
Метод: byte[] read(long i)
Опис: Овој метод го чита i-тиот објект од наведената датотека и го враќа како низа од бајти. Доколку i-тиот објект не постои во датотеката, се враќа null. Доколку датотеката не постои се фрла исклучок од типот DatabaseNotFound.
Метод: void write(long i, byte[] obj)
Опис: Овој метод го запишува i-тиот објект во наведената датотека. Доколку позицијата на објектот што треба да се запише е понапред од големината на датотеката (на пример датотеката има 3 објекти, а ние сакаме да го запишеме 5-тиот), тогаш од последниот објект во датотеката до i-тиот запишуваме празни објекти. Празен објект е составен од 16 нули. Доколку датотеката не постои, таа се креира.
Ме интересира како оди запишувањето - читањето на овие објекти во бинарната датотека, како
i - тиот објект би го вратил како низа од бајти?
 
Член од
19 септември 2015
Мислења
11
Поени од реакции
0
Zdravo na site. Jas sum IV god sredno sega pocnuvame so Delphi,no kako sto citam po forumov bilo za dzabe trosenje vreme.Planiram da se zapisam na KNI pa nekoj vas sovet koj pr. jazik bi bilo korisno da go sovladam malce od malce ?? Predhodnite godini ucev C++ i Pascal.
P.s : Pratete i nekoj link od kade bi mozel da naucam :)
Vi blagodaram :)
 
Член од
22 февруари 2007
Мислења
7.076
Поени од реакции
1.940
Zdravo na site. Jas sum IV god sredno sega pocnuvame so Delphi,no kako sto citam po forumov bilo za dzabe trosenje vreme.Planiram da se zapisam na KNI pa nekoj vas sovet koj pr. jazik bi bilo korisno da go sovladam malce od malce ?? Predhodnite godini ucev C++ i Pascal.
P.s : Pratete i nekoj link od kade bi mozel da naucam :)
Vi blagodaram :)
Делфи ти е убаво за да научиш објектно ориентирано програмирање и да осетиш малку работа со компоненти, визуелен интерфејс, бази и сл.
Во секој случај освен за учење и во некои легаси системи делфи е мртов.
Моја препорака е да земиш да научиш јава. Види јава референс матњријал

Sent from my Nexus 7 using Tapatalk
 

King B

Bears. Beets. Battlestar Galactica.
Член од
24 јануари 2011
Мислења
1.801
Поени од реакции
4.076
Zdravo na site. Jas sum IV god sredno sega pocnuvame so Delphi,no kako sto citam po forumov bilo za dzabe trosenje vreme.Planiram da se zapisam na KNI pa nekoj vas sovet koj pr. jazik bi bilo korisno da go sovladam malce od malce ?? Predhodnite godini ucev C++ i Pascal.
P.s : Pratete i nekoj link od kade bi mozel da naucam :)
Vi blagodaram :)
Паскал исто ти е бескорисен. На КНИ во прв семестар ќе учиш C, во втор C++, во трет Java :) Фати било кој од тие, колку што гледам колегиве со C највеќе се малтретираат иако мене лично не ми беше тежок.. Почни со тоа, совладај основна синтакса, циклуси и услови и рачунај си еден предмет за малтене положен :D[DOUBLEPOST=1442782717][/DOUBLEPOST]
Пак јас, имам еден проблем со јава I/O. Немам никакви материјали поврзани со RandomAccessFile а исто и на нет многу слабо е објаснето па морав да пишам тука. Проблемот во продолжение:
Код:
Напишете ги следните методи кои работат со бинарната датотека db.dat. Оваа датотека содржи типови на податоци со фиксна големина од 16 бајти. Се претпоставува дека датотеката може да биде многу голема (мерена во гигабајти). Влез/излез операциите да се имплементираат со помош на RandomAccessFile.
Метод: byte[] read(long i)
Опис: Овој метод го чита i-тиот објект од наведената датотека и го враќа како низа од бајти. Доколку i-тиот објект не постои во датотеката, се враќа null. Доколку датотеката не постои се фрла исклучок од типот DatabaseNotFound.
Метод: void write(long i, byte[] obj)
Опис: Овој метод го запишува i-тиот објект во наведената датотека. Доколку позицијата на објектот што треба да се запише е понапред од големината на датотеката (на пример датотеката има 3 објекти, а ние сакаме да го запишеме 5-тиот), тогаш од последниот објект во датотеката до i-тиот запишуваме празни објекти. Празен објект е составен од 16 нули. Доколку датотеката не постои, таа се креира.
Ме интересира како оди запишувањето - читањето на овие објекти во бинарната датотека, како
i - тиот објект би го вратил како низа од бајти?
За првиот метод, задачата вели дека секој објект во датотеката има фиксна големина од 16 бајти, па откако ќе направиш проверка дали датотеката воопшто постои
RandomAccessFile f = new RandomAccessFile (new File ("dat.db"), "r"))
if (f == null) return null или нешто слично,
ако таа постои креирај бафер во вид на низа од бајти
byte[] bafer = new byte[16].
Сега овој бафер ќе го наполниш со i-тиот објект од датотеката, односно i-тата низа од 16 бајти. За тоа да го направиш, прво треба да стигнеш до i-тиот бајт, а тоа се прави со seek() функцијата.
f.seek((i-1) * 16)
i-1 бидејќи ако како аргумент ти е предадено 1 (првите 16 бајти), треба да почнеш да читаш од нултата позиција на датотеката, т.е. од 0*16, не од 1*16.

Сега покажувачот за датотеката ти е позициониран кај што треба. Следно треба да ги превземеш наредните 16 бајти од датотеката со помош на readByte() и да ги сместиш секој во соодветното поле од баферот кој го направи, за на крај него да го вратиш како што бара задачата.
for (int j=0; j<16; j++)
bafer[j] = f.readByte();

return bafer;

Ова е псевдокод, секако :D
 
Последно уредено:

Емкаа

the worst thing about prison was the dementors.
Член од
14 мај 2008
Мислења
5.001
Поени од реакции
12.599
Дечки, ми треба помош, треба да сортирам хеш табела според value. Најдов еден куп кодови на интернет ама половината не ми работат, другата половина не ја разбирам. :D
 

Amaterasu

123123113
Член од
17 април 2012
Мислења
1.222
Поени од реакции
1.270
Дечки, ми треба помош, треба да сортирам хеш табела според value. Најдов еден куп кодови на интернет ама половината не ми работат, другата половина не ја разбирам. :D
Можеби треба малце да го преформулираш решението на проблемот, бидејќи хеш табела не би требала да се сортира, особено не по value. Со тоа ја нарушуваш самата хеш структура, односно позицијата на итемот не зависи само од клучот туку и од value-то.
Кога веќе имаш потреба да имаш одреден клуч а да сортираш според value, тогаш можеби е подобро да направиш сложен клуч, составен од старите key и value. Потоа во тој клуч ќе го имплементираш CompareTo или ќе напишеш компаратор кој ќе сортира како што сакаш. Потоа, наместо да користиш обичен хеш, ќе користиш TreeMap или TreeSet, па објектите ќе ти бидат постојано сортирани. Секако овие имплементации се поспори од хеш (логаритамско читање и додавање), но не ми текнува полесен начин за решавање на проблемот.
 
Член од
13 април 2013
Мислења
156
Поени од реакции
30
сега брзо завршив јава СЕ курс, дали може некој по упатен да ме насочи со да учам наредно од јава ЕЕ кои технологии се популарни моментално?
 
Член од
16 септември 2007
Мислења
1.486
Поени од реакции
338
Секогаш кога има отворено место можам да им понудам веднаш,за тие кои немаат квалификации ги гледаме нашите обуки, преквалификации, доквалификации, со тоа што секогаш препорачувам дека секоја нова вештина е ново знаење, нова можност за вработување, ново искуство -изјави Поповски.

Тој им препорача на младите во Куманово кои можеби имаат познавање од ИТ сферата, дека се уште се отворени огласите за јава и за Дот.Нет, каде што веднаш има понуда за работа.

Moze li nekoj da mi kaze za kolku vreme se uci Java i dot.net ako si apsoluten pocetnik ???
 

Емкаа

the worst thing about prison was the dementors.
Член од
14 мај 2008
Мислења
5.001
Поени од реакции
12.599
Ај некој ако работи со Spring нека ме контактира, цел ден заглавив со една грешка ( No qualifying bean of type [...] is defined ), конфигурацијата е ок не знам стварно веќе шо ја предизвикува грешкава.
 

Kajgana Shop

На врв Bottom