logi sisse meist KKK
0
1

Tere kuidas Javas massiivist numbreid kätte saab? Näiteks mul on massiiv milles on juhuslikud numbrid ja oleks vaja sealt kätte saada nt "mitu korda tuli 5, 4, 7, misiganes " jne.

küsitud Nov 23 '09 at 20:19

linux's gravatar image

linux
1111

Alustame põhitõdedest, kuidas massiividega ümber käia: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html

(Nov 23 '09 at 20:50) Harri Siirak

Mõningaid näiteid massiivide kasutamisest Javas:

// Loome massiivi suvalistest arvudest
int[] numbers = {4,6,7,8,3,1,7,6};

// kirjutame välja esimese arvu
System.out.println("First: " + numbers[0]); // trükib 4

// kirjutame välja teise arvu
System.out.println("Second: " + numbers[1]); // trükib 6

// kirjutame välja kõik arvud
for (int nr : numbers) {
    System.out.println(nr);
}

// loendame, mitu korda esineb arv 6 massiivis
int count = 0;
for (int nr : numbers) {
    if (nr == 6) {
        count = count + 1;
    }
}
System.out.println("Nr 6 was found " + count + " times.");

Loendamaks kõikide arvude esinemissagedusi vajad sa tõenäoliselt Hashtable klassi abi.

Näiteks nõnda:

Hashtable<Integer, Integer> nrCounts = new Hashtable<Integer, Integer>();

// Käime läbi kõik 'numbers' massiivis olevad arvud
for (int nr : numbers) {
    // kui arvu pole veel sagedustabelis, siis lisame selle sagedusega 1
    if (nrCounts.get(nr) == null) {
        nrCounts.put(nr, 1);
    }
    // kui arv juba esineb, siis suurendame seda ühe võrra
    else {
        nrCounts.put(nr, nrCounts.get(nr) + 1);
    }
}

// Trükime välja kõigi arvude esinemissagedused
for (int nr : nrCounts.keySet()) {
    System.out.println("Arv " + nr + " esines " + nrCounts.get(nr) + " korda.");
}
link

vastatud Nov 24 '09 at 20:31

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k101121

edited Dec 07 '09 at 21:26

Tänan asi korras, massiividega olen ka ennem kokku puutunud, aga see asi jäi veidi selgusetuks, nüüd on see ülesanne lahendatud mis esialgu eesmärgiks oli, tänud heade näidete eest.

link

vastatud Nov 25 '09 at 18:26

linux%201's gravatar image

linux 1
1

import java.util.*;
    public class Otsimine {
      public static void main(String args[]) throws Exception {
        int array[] = {2, 5, -2, 6, -3, 8, 0, -7, -9, 4}; // Järjend

        // Sorteerime järjendi
        Arrays.sort(array);
        printArray("Sorteeritud järjend:", array);

        // Otsime elemendi järjendist
        int index = Arrays.binarySearch(array, 2);
        System.out.println("Leidsin 2 @ " + index+" korda");

Aga siitkohalt üks küsimus, kuidas saaks kahest järjendist kätte samad arvud?

 int esimene[] = {2, 5, -2, 6, -3, 8, 0, -7, -9, 4};
 int teine[] = {3, 5, -3, 6, -9, 8, 0, -8, -9, 4};

Kuidas siit korduvad arvud kätte saaks? Ise mõtlesin nii et kaks tsüklit, mis vaatavad esialgu kõik elemendid läbi ja siis mingi if lausega võrdleks neid.

     class Massiiv2 {
    public static void main(String[] args) {
        int esimene[] = {4,6,7,9,5,5};
        int teine[] = {6,5,4,9,5,10};
        for (int i = 0; i < esimene.length; i++)
          for (int j = 0; j < teine.length; j++)
            if (esimene[i] == teine[j] && esimene[i] != 0) { 
// Samas vaatame et poleks 0
           System.out.print(" ("+esimene[i]+","+teine[j]+") ");  // V2ljastame
             esimene[i] = 0; // Paneme 0-ks, kuna neid me enam ei kasuta
             teine[j] = 0;
    		 break; // Katkestame sisemise tsükli,
// välimine suurendab ikka oma muutujaid
          }
    }
}
link

vastatud Nov 27 '09 at 14:05

Timo's gravatar image

Timo
21226

edited Nov 29 '09 at 10:31

Põhimõtteliselt oled sa õigel teel.

(Nov 27 '09 at 15:54) Harri Siirak

Katsusin veidi su viimast koodilõiku treppida, aga puuduvad loogelised sulud tekitavad segadust.

(Nov 27 '09 at 19:51) Rene Saarsoo ♦♦

Mainid ehk täpsemalt, mis asi sul konkreetselt raskusi tekitab. Võibolla on abi sellest kui katsud seletada sõnadega kuidas see duplikaatide leidmine võiks sinu arvates käjja.

(Nov 27 '09 at 20:07) Rene Saarsoo ♦♦

Aga trükigi siis seal if-i sees need korduvad arvud välja ja vaata mis juhtub. Ühtlasi, palun kasuta loogelisi sulge iga if-i ja for-i järel - hetkel on su koodist päris raske aru saada.

(Nov 28 '09 at 08:11) Rene Saarsoo ♦♦
1

Kui ühes massiivis on N ja teises M elementi, siis kulub kõigi paarida läbivaatamiseks umbes N*M operatsiooni. Kui massiivid on pikad, on efektiivsem alguses natuke sorteerimisele aega kulutada.

(Nov 28 '09 at 21:49) Ahto Truu ♦♦

Üks võimalus on mõlemad massiivid ära sorteerida (umbes Nlog(N)+Mlog(M) operatsiooni) ja siis nad paralleelselt läbi vaadata (umbes N+M) operatsiooni.

(Nov 28 '09 at 21:50) Ahto Truu ♦♦

Teine võimalus on lühem neist ära sorteerida (umbes Nlog(N) operatsiooni) ja siis pikema iga elementi kahendotsimisega otsida (umbes Mlog(N)) operatsiooni.

(Nov 28 '09 at 21:52) Ahto Truu ♦♦

Kui massiivi elementide väärtused on piiratud (näiteks kõik 1..K), siis on veel variant teha kaks K-elemendilist tõeväärtuste massiivi t1[] ja t2[], panna t1[] tõeseks need, millele vastavad väärtused esinevad esimeses massiivis (koos t1 algväärtustamisega K+N operatsiooni) ja t2[] need, millele vastavad väärtused esinevad teises massiivis (K+M operatsiooni). Siis käia t1[] ja t2[] paralleelselt läbi ja trükkida välja need väärtused, millele vastavad elemendid on mõlemas tõesed (K operatsiooni).

(Nov 28 '09 at 21:57) Ahto Truu ♦♦

Ehk tooksid mõned näited sorteerimistest ja nende efektiivsusest. Milline on kiire algoritm jne?

(Nov 29 '09 at 10:44) Timo
1

@Timo: Postita parem pinu.ee-sse uus küsimus.

(Nov 29 '09 at 10:54) Rene Saarsoo ♦♦
näitan 5/10 näita kõiki

Aga kuidas nii saab, et millist elementi esineb järjendis kõige rohkem.

         int[] a = {13,10,18,19,20,15,3,3,4,5,6,7,6,4,3,1,1}; 
         for (int i = 0; i < a.length; i++) {
         for (int j=0; j < a.length; j++) {
            if(a[i]==a[j]) {
            count++;
            }

    int max = Integer.MIN_VALUE; // Võimalikult väike arv
    // Max väärtuse leidmine järjendist
    for (int i = 0; i < a.length; i++) {
          if (a[i] > max) {
          max = a[i];
     }
            }

   System.out.println("Suurima elemendi väärtus on "+max);
          }
         }
link

vastatud Dec 04 '09 at 20:02

linux%202's gravatar image

linux 2
11

edited Dec 05 '09 at 18:57

Noh, sa ju ütlesid, et lahendasid teema alguses püstitatud ülesande ära. Kui sul see tõesti tehtud on, siis on sul ju pool ülesannet lahendatud - sul peaks olema sel juhul teada kõigi arvude esinemissagedused. Seejärel on üpris lihtne leida nende seast suurima esinemissagedusega arv.

(Dec 05 '09 at 10:03) Rene Saarsoo ♦♦

No ma oskan leida näiteks mitu korda leidub 2,3 jms. Suurimat esinemissagedusega elementi on sealt muidugi kerge leida siis juba.

(Dec 05 '09 at 14:06) linux 2

Nii. Modifitseerisin nüüd oma esialgset vastust. Vaata sealt seda Hashtable kasutamise näidet.

(Dec 06 '09 at 16:14) Rene Saarsoo ♦♦

Tänan selle-eest, seda ma suutsin ise ka, aga ma tahtsin muidu järjendist kõik korduvad elemendid kätte saada. Kuidas see võiks välja näha?

(Dec 06 '09 at 19:34) linux 2

See tähendab kas mingit algoritmi ei ole selleks, või saabgi ainult kasutada hashtabelit?

(Dec 06 '09 at 19:36) linux 2
1

Väga abiks oleks tulevastele lugejatele kui uued küsimused püstitataks eraldi küsimustena, mitte mõne teise küsimuse sabasse. (Stiimuliks seda teha ütlen, et duplikaatide leidmiseks on mitu head algoritmi ja luban vähemalt mõne neist vastuseks postitada, kui teed uue küsimuse, kuhu selgelt kirja paned, mida vaja on :)

(Dec 06 '09 at 21:58) Ahto Truu ♦♦
näitan 5/6 näita kõiki
Sinu vastus
lülita eelvaade

Jälgi seda küsimust

By Email:

Pärast sisselogimist saad tellida muudatuse teavitusi siit

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *kaldkiri* või __kaldkiri__
  • **paks kiri** või __paks kiri__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • põhilised HTML märgendid on samuti toetatud

Pinu tööpakkumised

kõik pakkumised »

Küsimuse sildid:

×16

küsitud: Nov 23 '09 at 20:19

nähtud: 4,257 korda

viimati uuendatud: Dec 07 '09 at 21:26

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee