Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java "oma tietorakenne", auttakaa aloittelijaa!

Slaya83 [04.05.2011 10:34:15]

#

Hei!

Olen tehnyt harjoitustyön koululle Javalla, kyseessä työntekijäluettelo. Ohjelma toimii muuten ok, mutta ohjaajan mukaan ohjelmassa ei ole toteutettu yhteeän tietorakennetta itse, vaan käytetty Javan valmiita tietorakenteita.

Osaisiko joku neuvoa miten muokkaan ohjelmaa näppärästi siten, että korvaan jonkun olemassa olevista tietorakenteista itse tehdyllä tietorakenteella?

Tässä alla yksi tietorakenne, voisiko esim. sitä muokata jotenkin, että
olisi "itse tehty"? Auttakaa miestä mäessä nyt!

P.S. Jos ei alla olevaa voi muokata näppärästi, niin kertokaa joku pieni esimerkkikoodi, jolla luon oman tietorakenteen...

OHEINEN KOODI LUKEE TIEDOSTON SISÄLLÖN ARRAY LISTIIN
=====================================================================

BufferedReader input = null;
      try {
          input = new BufferedReader(new FileReader("osasto.txt")); // read file
      }
      catch (FileNotFoundException ex) {
          Logger.getLogger(MainWindowJPanel.class.getName()).log(Level.SEVERE, null, ex);
      }
      ArrayList<String> strings = new ArrayList<String>(); // New arraylist
      try {
          String line = null;
          while (( line = input.readLine()) != null) {

              StringTokenizer department = new StringTokenizer(line,"|");

              id = department.nextToken();
              first = department.nextToken();
              last = department.nextToken();
              line = id + " " + first + " " + last;



              strings.add(line); // Add line to arraylist
          }
      }
      catch (IOException ex) {
          Logger.getLogger(MainWindowJPanel.class.getName()).log(Level.SEVERE, null, ex);
      }
      finally {
          try {
              input.close(); // Close file
          }
          catch (IOException ex) {
              Logger.getLogger(MainWindowJPanel.class.getName()).log(Level.SEVERE, null, ex);
          }
      }

Antti Laaksonen [04.05.2011 10:43:17]

#

Javan valmiita tietorakenteita ovat esimerkiksi ArrayList ja HashMap. Ainoa tuossa koodissa oleva tietorakenne on ArrayList. Voit korvata sen omalla toteutuksella tallentamalla tiedot taulukkoon ja huolehtimalla taulukon koon kasvattamisesta tarvittaessa. Tässä ei ole kuitenkaan järkeä, ellei tarkoitus ole nimenomaan harjoitella tietorakenteiden toteutusta itse.

Slaya83 [04.05.2011 10:55:14]

#

Tarkoitus on nimenomaan harjoitella taulukon tekemistä itse. Tuossa on tosiaan vain pätkä kokonaiskoodista. Kokonaiskoodi on tuhansia rivejä pitkä.

Olisiko sinulla heittää koodinpätkää, jota voisin soveltaa tuohon oman taulukon luontiin?

tsuriga [04.05.2011 11:08:33]

#

http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html
tuolta toteutat noi perusmetodit add, get, set, remove vaikkapa. Taulukon kokoa pääset kasvattamaan kopioimalla taulukon Arrays.copyOf-metodilla (nopeudesta vs. esim. Vectorin käyttöön en tiedä, kuulemma ainakin System.arraycopy on toiminut suhteellisen nopeasti, mutta millä tietomäärillä). Esimerkkejä löytyy varmasti pilvin pimein ellet itse halua ajatella tietorakenteen toimintalogiikkaa.

Triton [04.05.2011 11:12:17]

#

String taulukko = new String[ 5 ];

Ylläoleva koodi luo viiden alkion kokoisen merkkijonotyyppisen taulukon.
Javassa taulukot ovat staattisia, joten niiden kokoa ei pysty jälkikäteen muuttumaan. Näin ollen sinulle jää kaksi vaihtoehtoa homman tekemiseen:
Luet ensin tiedostosta työntekijät ja sitten luot sopivan kokoisen taulukon sen mukaan montako työntekijää tiedostosta löytyi (tämä vaihtoehto ei välttämättä ole kovin järkevä) tai toteutan oman listarakenteen siten, että kapseloit normaalin taulukon luokan sisään ja kun alkuperäinen taulukko täyttyy luot isomman, johon lisäät alkuperäisen taulukon alkiot sekä uudet alkiot. Javan valmis ArrayList toimii samaan tapaan...

Edit.

tsuriga kirjoitti:

Vectorin käyttöön en tiedä, kuulemma ainakin System.arraycopy on toiminut suhteellisen nopeasti, mutta millä tietomäärillä).

Javan Vector-luokka eroaa ArrayLististä muistaakseni pääpiirteissään vain siten, että se on synkronoitu. Näin ollen jos ei ole erityistä tarvetta nimenomaan synkronoidulle taulukkorakenteelle on tehokkaampaa käyttää ArrayListiä.

Metabolix [04.05.2011 16:04:00]

#

Käytännöllisin ratkaisu on korvata kaikki ArrayList-kohdat koodista omalla nimellä (OmaArrayList) ja toteuttaa sitten tämä OmaArrayList siten, että se toimii (riittävässä määrin) identtisesti Javan oman version kanssa.

tsuriga [05.05.2011 03:36:02]

#

Triton kirjoitti:

tsuriga kirjoitti:

Vectorin käyttöön en tiedä, kuulemma ainakin System.arraycopy on toiminut suhteellisen nopeasti, mutta millä tietomäärillä).

Javan Vector-luokka eroaa ArrayLististä muistaakseni pääpiirteissään vain siten, että se on synkronoitu. Näin ollen jos ei ole erityistä tarvetta nimenomaan synkronoidulle taulukkorakenteelle on tehokkaampaa käyttää ArrayListiä.

Niin siis viittasin tuossa juurikin oman ArrayListin toteuttamiseen Vectorin avulla vs. taulukoilla :).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta