Permalänk

Java array hjälp

Håller på med array i java och får inte riktigt till det helt enkelt, det jag vill göra är att slumpa ett antal tal (antalet matas in av användaren) och sen räkna hur många av dom talen som är i intervallet 0-499
och skriva ut det. jag har hitills bara lyckats få till random delen om man säger så
Någon som kan hjälpa mig?

import java.util.Scanner;

public class tal {

public static void main(String[] args) {
//Variabeldeklaration
Scanner keyboard = new Scanner(System.in);
int choise = 0;
int[] numbers = new int[999];

System.out.println("Antal slumpningar mellan 0-999: ");
choise = keyboard.nextInt();

System.out.println("Dina slumpade tal: ");
for (int i = 0; i < choise; i++)
{
numbers[i] = (int)(Math.random()*999 + 1);
System.out.print(numbers[i] + " ");
}
System.out.println();

}

}

Visa signatur

AMD Phenom II X4 9556- kylls av Cooler Master V8 - Windows 7 64BIT - 8 GB 1600Mhz Corsair DDR3 - Radeon HD 6800 - Cooler Master Scout - Silver Power SP-SS620M 620W PSU - Corsair SSD Force Series F60A, 60GB - Western Digital Caviar Black 1,5TB 7200RPM-

Permalänk
Medlem

int counter = 0;

sedan i loopen lägg en kontrollsats t.ex.
if(numbers[i] < 500 ) counter++;

då kommer counter innehålla antalet tal mellan 0-499.
lite annat:
"choise" stavas choice.
du bör initiera arrayen efter att du har tagit in "choice", så att antal element är densamma som antalet slumpade tal.
kan tipsa dig om att kolla på klassen Random som finns under java.util ( Random random = new Random(); ) den har bland annat en metod .nextInt( int param ); som returner att tal mellan 0 och parametern.
lycka till!

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

while(i<count){
sätt random värde.. på variabel[i];
i++;
}

eller använd dig av arrayList

Permalänk

Eller LinkedList, att append:a n stycken element på en arraylist har tidskomplexitet n^2...

Permalänk
Medlem
Skrivet av NightKnight:

Eller LinkedList, att append:a n stycken element på en arraylist har tidskomplexitet n^2...

Det stämmer inte. Att appenda n element på en ArrayList, dvs lägga till på slutet har en tidskomplexitet på n.

Enligt många som tittat på prestanda så bör man i Javavärlden välja ArrayList framför LinkedList i merparten av fallen.

//C

Permalänk
Medlem
Skrivet av conio:

Det stämmer inte. Att appenda n element på en ArrayList, dvs lägga till på slutet har en tidskomplexitet på n.

Enligt många som tittat på prestanda så bör man i Javavärlden välja ArrayList framför LinkedList i merparten av fallen.

//C

Att appenda i slutet av en ArrayList är givetvis snabbt, men hur blir det om man insertar i början av den och alla följande värden måste flyttas? Det borde vara en dyr operation, särskilt om det sker i en slinga.

Att lägga till värden i en länkad lista är alltid direkt och alltid lika snabbt (oberoende av längden på listan), så länge värdet infogas i listans "huvud". Jag använder nästan uteslutande länkade listor i de fall där jag vill bearbeta en på förhand okänd mängd värden, vilket jag upplever vara det vanligste fallet när man gör ett urval ur en databas, bearbetar rader i en textfil eller noder i ett nodträd, etc.

(I exemplet ovan hade jag använt en vanlig array eller ArrayList eftersom antalet värden är känt)

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Att appenda i slutet av en ArrayList är givetvis snabbt, men hur blir det om man insertar i början av den och alla följande värden måste flyttas? Det borde vara en dyr operation, särskilt om det sker i en slinga.

Absolut, det blir det ju. Så fort du är intresserad av att lägga till poster lite här och där i listan så blir givetvis den operationen dyr. Det var nog lite språkförvirring som gjorde att jag svarade som jag gjorde. Append (eller försvenskningen appenda) betyder ju "lägga till på slutet" och motsatsen till det är ju det lite mer ovanliga prepend.

Skrivet av Teknocide:

Att lägga till värden i en länkad lista är alltid direkt och alltid lika snabbt (oberoende av längden på listan), så länge värdet infogas i listans "huvud". Jag använder nästan uteslutande länkade listor i de fall där jag vill bearbeta en på förhand okänd mängd värden, vilket jag upplever vara det vanligste fallet när man gör ett urval ur en databas, bearbetar rader i en textfil eller noder i ett nodträd, etc.

(I exemplet ovan hade jag använt en vanlig array eller ArrayList eftersom antalet värden är känt)

Jag säger inte emot ditt resonemang men jag tycker inte det känns helt naturligt i mina ögon. I länkade listor så går det fort att lägga till värden i huvudet eller svansen (dvs längst fram eller bak). Fast användningsfallet att lägga till saker i huvudet tycker jag väldigt sällsynt.

Använder man databasurvalet som användningsfall så ser jag definitivt inte varför man skulle vilja överföra det urvalet i omvänd ordning. Oftast så skapar man ju sin lista i samma ordning som databasen returnerar. Sedan kan man ju manipulera den om man vill men det är ju en annan sak.

Jag resonerade som dig förut, dvs vet man inte exakt antal så körde jag med LinkedList. Dock har ju den klassen en aspekt som man måste vara medveten om prestandamässigt. Det är ju att för varje element som man lägger till i listan så skapas ju en intern länk. Det innebär att lägger du till 100 element i en LinkedList så skapas det 100 länk-objekt som givetvis belastar på minnesallokatorn och skräpuppsamlaren. Hade man däremot kört en ArrayList så hade den internt varit tvungen att utöka sin interna array några gånger för att få plats med alla 100 objekt och kopiera det gamla innehållet men rent beräkningsmässigt så är det mycket billigare än att allokera massa länkobjekt.

//C

PS. Tog bort en dubbel-quote i meddelandet.

Permalänk
Medlem

Stackars TS som bara ville ha sin lilla array

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem
Skrivet av conio:

Absolut, det blir det ju. Så fort du är intresserad av att lägga till poster lite här och där i listan så blir givetvis den operationen dyr. Det var nog lite språkförvirring som gjorde att jag svarade som jag gjorde. Append (eller försvenskningen appenda) betyder ju "lägga till på slutet" och motsatsen till det är ju det lite mer ovanliga prepend.

Jag säger inte emot ditt resonemang men jag tycker inte det känns helt naturligt i mina ögon. I länkade listor så går det fort att lägga till värden i huvudet eller svansen (dvs längst fram eller bak). Fast användningsfallet att lägga till saker i huvudet tycker jag väldigt sällsynt.

Använder man databasurvalet som användningsfall så ser jag definitivt inte varför man skulle vilja överföra det urvalet i omvänd ordning. Oftast så skapar man ju sin lista i samma ordning som databasen returnerar. Sedan kan man ju manipulera den om man vill men det är ju en annan sak.

Jag resonerade som dig förut, dvs vet man inte exakt antal så körde jag med LinkedList. Dock har ju den klassen en aspekt som man måste vara medveten om prestandamässigt. Det är ju att för varje element som man lägger till i listan så skapas ju en intern länk. Det innebär att lägger du till 100 element i en LinkedList så skapas det 100 länk-objekt som givetvis belastar på minnesallokatorn och skräpuppsamlaren. Hade man däremot kört en ArrayList så hade den internt varit tvungen att utöka sin interna array några gånger för att få plats med alla 100 objekt och kopiera det gamla innehållet men rent beräkningsmässigt så är det mycket billigare än att allokera massa länkobjekt.

//C

PS. Tog bort en dubbel-quote i meddelandet.

Den länkade listan i Java verkar vara dubbellänkad vilket kan tyckas lite synd eftersom varje List-item håller två referenser istället för bara en, vilket är tillräckligt för det mesta. Jag inte hur den är implementerad internt men en "smart" länkad lista är en tunn wrapper runt ett värde, med en referens till nästa länkade lista (jag gissar att det är detta du menar). Implementeras den på detta vis är utrymmeskravet negligerbart för referensen, men att skapa varje list-item är förhållandevis dyrt. När listan väl "är igång" är filteroperationer, sortering osv mycket effektivare då listan kan delas i flera bitar utan någon nyallokering, och inte behöver byggas om när ett värde tas bort.

Skrivet av Gnejs:

Stackars TS som bara ville ha sin lilla array

Ja faktiskt, jag är ganska duktig på att nappa och börja prata tekniska grejer som inte riktigt hör ärendet till. Förhoppningsvis är det lätt att sålla igenom och hitta de värdefulla bitarna ändå, och förhoppningsvis är det intressant för fler än mig..

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Hej igen!

Skrivet av Teknocide:

Den länkade listan i Java verkar vara dubbellänkad vilket kan tyckas lite synd eftersom varje List-item håller två referenser istället för bara en, vilket är tillräckligt för det mesta. Jag inte hur den är implementerad internt men en "smart" länkad lista är en tunn wrapper runt ett värde, med en referens till nästa länkade lista (jag gissar att det är detta du menar). Implementeras den på detta vis är utrymmeskravet negligerbart för referensen, men att skapa varje list-item är förhållandevis dyrt. När listan väl "är igång" är filteroperationer, sortering osv mycket effektivare då listan kan delas i flera bitar utan någon nyallokering, och inte behöver byggas om när ett värde tas bort.

Anledningen till att den är dubbellänkad är antagligen för att möjliggöra bra prestanda på interfacet java.util.ListIterator som samtliga standardlistklasser bland Collections-klasserna implementerar. Till skillnad från vanliga java.util.Iterator där man kan stega igenom en lista från början till slutet så kan man stega både fram och bak med en ListIterator. Håller dock med dig att det i särklass vanligaste användningsfallet är att man stegar/itererar igenom hela listan framifrån till slutet och gör något med innehållet under tiden.

Din beskrivning av hur en "smart" länkad lista stämmer även in på LinkedList med just den redna nämnda detaljen att den tunna wrappern innehåller referenser till både föregående och nästa element.

Det jag dock fortfarande vill påpeka att man måste vara väldigt medveten att varje tillägg på en LinkedList medför en allokering av ett nytt objekt. Du verkar förstå det men jag skriver det för att förtydliga för andra som läser och är intresserade av de olika aspekterna runt val av olika list-klasser.

Det finns ju ett fall där LinkedList är riktigt dålig. Det är när man vill hämta godtyckligt element i listan. Med en LinkedList så måste den stega från början (eller slutet) tills den nått objektet. Här är dubbellänkningen till en liten hjälp för listan kan välja att stega antingen från början eller slutet beroende på vilken som är närmast målet. En ArrayList däremot, som bara har en intern array har ju "omedelbar" tillgång till alla objekt. Så när det handlar om "random access" så vinner ju ArrayList stort.

Jag håller med dig om att filteroperationer är smidiga med länkade listor, där man i ett eller flera omgångar ska filtrera bort (eller göra urval av) objekt.

Däremot sortering är mer tveksamt. Även om det kan verka logiskt så behöver man inte ta bort några element ur listan när man sorterar. Det räcker med att ersätta dem. Eftersom alla element i listan bara är referenser så är själva ersättandet billigt.

Det är ju något som Sun själva tänkte på när de implementerade sina standard-sorteringsrutiner. Detta är saxat från java.util.Collections#sort(List) och java.util.Collections#sort(List,Comparator) (den sistnämnda är ju ett bra sätt att sköta sortering med egna krav):

Citat:

This implementation dumps the specified list into an array, sorts the array, and iterates over the list resetting each element from the corresponding position in the array. This avoids the n2 log(n) performance that would result from attempting to sort a linked list in place.

Sedan är det ju ingen riktigt inlägg om man inte har en personlig anekdot

Jag jobbar mycket med större finansiella system där givetvis prestanda är en väldigt viktig parameter i det hela. I många fall så handlar användningsfallet att få en lista från någonstans (till exempel en databas) och sedan filtrera bort prylar man inte vill ha med och sedan passera de vidare till nästa aktör i kedjan.

Efter benchmarking så var valet självklart hos oss. ArrayList vinner som filtreringslista. Om vi fortsätter med exemplet långt ovan med 100 poster. Vad som händer är att vi får en lista med de 100 posterna i (det exakta antalet och implementationen av listan vet vi inte i förhand). Sedan skapar vi en ny ArrayList som är den som ska innehålla det filtrerade resultatet med en initial kapacitet av lika många poster som den första (dvs 100). Det gör att vi kan snabbt stega över inlistan och kopiera över det vi vill filterlistan utan att orsaka en enda väx-operation på resultat listan. I värsta fall dock så ska allt filtreras bort och då har vi en ArrayList med 0 element i sig men med en intern allokering av 100. Fast då det är referenser så är det förhållandevis billigt. Den stora prestandavinsten är dock i att vi slipper alla interna allokeringar (och sedan den efterföljande skräpuppsamlingen) som LinkedList innebär. Minnesallokatorn är ju i värsta fall en resurs som är delad med alla trådar som körs i JVM:en.

Fast som sagt, detta är en personlig anekdot. Olika användningsfall och situationer kräver olika lösningar. Att utvärdera olika lösningar i sin egen miljö är alltid bra istället för att bara lyssna på olika personer på forum

Ha en bra dag!

//C

PS: Gnejs, vadå? Det här är väl ungefär vad trådskaparen frågade efter?