Java, räkna antal delar av en talserie

Trädvy Permalänk
Medlem
Registrerad
Apr 2014

Java, räkna antal delar av en talserie

Jag väljer hur många tal jag ska slumpa till en talserie mellan 1 och 999. Efter att jag skrivit ut den och sorterat den i fallande serie ska jag plocka ut vilka tal i serien som är jämna. Det funkar, men sen fastnar jag på hur jag ska kunna räkna ut antalet jämna tal. Mina sista kodrader längst ner skriver inte ut något alls!

import java.util.Scanner;

public class Problem {
public static void main(String[] args) {

// Deklarera variabler som behövs
int antalNr, sum = 0;

// Mata in antal som ska slumpas
Scanner matain = new Scanner(System.in);
System.out.print("Hur många slumptal i intervallet 0-999 önskas?");
antalNr = matain.nextInt();
matain.nextLine(); // Rensa inmatningsbufferten

int[] array = new int[antalNr];
int bredd = array.length;
int max = 0;
int rad = 0;

// Slumpning av talen
for (int i = 0; i < bredd; i++) {
array[i] = (int) (Math.random() * 1000) + 1;
}
System.out.println();
System.out.println("Här är de slumpade talen.");

// Skriv ut osorterat
for (int i = 0; i < antalNr; i++) {
System.out.print(array[i] + " ");
}
System.out.println();

// Sorterar talserien
for (int i = 0; i < bredd - 1; i++) {
max = i;
for (int k = i + 1; k < bredd; k++) {
if (array[k] > array[max]) {
max = k;
}
}
// Byter plats på två platser i arrayen
rad = array[i];
array[i] = array[max];
array[max] = rad;
}
System.out.println();
System.out.println("Här är de slumpade talen ordnade.");

// Skriv ut sorterat
for (int i = 0; i < bredd; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
System.out.println();

// Summera talkedjan (för senare koll av resultatet)
for (int i = 0; i < array.length; i++) {
sum = sum + array[i];
}

System.out.println("Summan är " + sum + " och de jämna talen är:");

int[] evenArray = new int[antalNr];
int evenCounter = 0;
int[] antalEven = new int[evenCounter];

for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 0) {
evenArray[evenCounter] = array[i];
System.out.print(+evenArray[evenCounter] + ", ");
evenCounter++;
}

// int length = antalEven.length;

for (int a = 0; a < antalEven.length; a++) {
System.out.print("\nAntal " + evenArray[a]);
}
}

}
}

Är det någon som ser var jag trasslat till det?

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Vad är syftet med antalEven? Du sätter dess längd till 0, så sista for-loopen kommer köras 0 gånger.

Trädvy Permalänk
Medlem
Registrerad
Apr 2014

@Tazavoo:
Jag försökte göra en array av evenCounter, och då krävde systemet att jag satte nya arrayen till 0.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2009

Ditt problem är att evenArray alltid kommer bli 0 platser lång. Det du vill göra är att köra en loop över hela listan först, för att bestämma vad evenCounter ska vara. Efter det kan du skapa evenArray med rätt storlek, och sedan stoppa in alla jämna tal i den.

evenCounter=0 // Loopa genom listan, räkna antal jämna tal for (int i=0, i<array.length, i++) { if array[i] % 2 == 0 { evenCounter++ } } // Skapa listan med jämna tal int[] evenArray = new int[evenCounter] int j = 0 // index för evenArray // Loopa igenom listan igen, den här gången för att hämta de jämna talen. for (int i=0, i<array.length, i++) { if (array[i] % 2 == 0) { evenArray[j] = array[i] j++ } }

NOTE: Jag skrev den här koden on the fly och har inte testat den syntaxmässigt, men själva principen ska funka.

NZXT H2, OCZ ModXStream-PRO 600W, MSI P67A-C45, Intel i5 2500K @ 4.4GHz, Gigabyte GTX 460, 4GB Corsair Vengeance DDR3 1600MHz CL9 (2x2GB), OCZ Agility 60GB, Seagate Barracuda 250GB, 2x Western Digital Caviar 1TB

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2009

För övrigt rekommenderar jag dig att använda ArrayList istället för int[]. Dess metoder .add() och .remove() är väldigt användbara.
Also, istället för en egen sortering kan du använda Collections.sort(object). Det funkar både för int[] och ArrayList, samt de flesta andra inbyggda listtyperna i java.

NZXT H2, OCZ ModXStream-PRO 600W, MSI P67A-C45, Intel i5 2500K @ 4.4GHz, Gigabyte GTX 460, 4GB Corsair Vengeance DDR3 1600MHz CL9 (2x2GB), OCZ Agility 60GB, Seagate Barracuda 250GB, 2x Western Digital Caviar 1TB

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2003

Om man får snobba till det lite så kan man göra det hela avsevärt mer kompakt mha Java 8 streams.

public static void main(String[] args) { Scanner matain = new Scanner(System.in); System.out.print("Hur många slumptal i intervallet 0-999 önskas?"); int antalNr = matain.nextInt(); matain.nextLine(); // Rensa inmatningsbufferten // Skapar lista av slumpmässiga heltal mha IntStream och limit() List<Integer> slumpadeHeltal = Arrays.asList(IntStream.generate(() -> ThreadLocalRandom.current().nextInt(1000)) .limit(antalNr) // Begränsa storleken till angivet värde .boxed() // Konvertera strömmen till Stream<Integer> .toArray(Integer[]::new)); // Konvertera till Integer[] så Arrays.asList() blir nöjd System.out.println("Antal jämna tal: " + slumpadeHeltal.stream() // Skapa ström av listan .filter(i -> i % 2 == 0) // Applicera ett filterpredikat för att få bort ojämna tal .count()); // Räkna antalet kvarvarande element i strömmen System.out.println("Summa av de jämna talen: " + slumpadeHeltal.stream() .filter(i -> i % 2 == 0) .reduce(0, Integer::sum)); // Som ovan, men använder reduce och sum-funktionen på Integer-klassen System.out.println("Samtliga jämna tal i stigande ordning: " + slumpadeHeltal.stream() .filter(i -> i % 2 == 0) // Filtrera bort ojämna .sorted() // Sortera stigande .map(tal -> Integer.toString(tal)) // Konvertera varje tal till sträng .collect(Collectors.joining(", "))); // Slå ihop alla tal (nu strängar) till en lång sträng med komma mellan }

Utfall:

Hur många slumptal i intervallet 0-999 önskas?10 Antal jämna tal: 7 Summa av de jämna talen: 3350 Samtliga jämna tal i stigande ordning: 10, 352, 362, 426, 466, 854, 880

Trädvy Permalänk
Medlem
Registrerad
Apr 2014

@Lupson: Tjusigt!