Saya seorang pemula di Jawa. Untuk tugas saya, saya telah diberikan tabel seperti itu. Tabel tersebut mewakili 6 pelari yang berpartisipasi dalam 7 balapan. Nilai di setiap sel adalah tempat yang mereka dapatkan di balapan tertentu:

The table

Tugas program saya adalah untuk mencetak jumlah pelari yang finis pertama di setidaknya satu balapan. Saya berhasil menulis kode yang menghitung jumlah tempat pertama yang diraih oleh semua pelari, namun saya berjuang untuk menemukan solusi bagaimana menambahkan pelari tersebut, yang selesai 1 beberapa kali, ke hitungan hanya sekali. Bagaimana cara saya mengulangi ke baris berikutnya ketika nilai yang cocok telah ditemukan dan ditambahkan ke hitungan? Inilah kode saya sejauh ini:

public class MyClass {
    public static void main(String[] args) {
        int A[][] = {{21, 14, 1, 21, 19, 5, 2},
                {4, 27, 1, 7, 25, 19, 19},
                {12, 20, 25, 11, 30, 14, 15},
                {5, 8, 5, 7, 1, 2, 13},
                {20, 2, 14, 4, 25, 1, 1},
                {14, 20, 20, 15, 11, 18, 16}};

        int i, j;
        int counter = 0;

        System.out.println("result:");
        for (i = 0; i < 6; i++) {
            for (j = 0; j < 7; j++) {
                if (A[i][j] == 1) {
                    counter++;
                }
            }
        }
        System.out.print(counter);
    }
}
1
Peter 24 November 2020, 17:49

3 jawaban

Jawaban Terbaik

Untuk melacak pelari yang sudah finish pertama dalam perlombaan, Anda dapat memiliki array Boolean seperti berikut:

boolean[] firstPlaceRunner = new boolean[A[0].length];

Posisi i dari array boolean di atas menyimpan informasi berikut:

  1. Benar - jika pelari ke-i mendapatkan tempat pertama di salah satu balapan.
  2. Salah - Jika pelari ke-i tidak dapat mengamankan posisi pertama di salah satu balapan.

Jadi, sekarang dalam kode Anda, Anda hanya dapat menambah penghitung ketika pelari saat ini belum mengamankan tempat pertama. Jadi kode Anda terlihat seperti ini:

public static void main(String[] args) {
    int[][] A = {{21, 14, 1, 21, 19, 5, 2},
            {4, 27, 1, 7, 25, 19, 19},
            {12, 20, 25, 11, 30, 14, 15},
            {5, 8, 5, 7, 1, 2, 13},
            {20, 2, 14, 4, 25, 1, 1},
            {14, 20, 20, 15, 11, 18, 16}};
    int counter = 0;
    // A[0].length gives the number of runner in any race
    boolean[] firstPlaceRunner = new boolean[A[0].length];
    for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 7; j++) {
            if (A[i][j] == 1) {
                if (!firstPlaceRunner[j]) {
                    counter++;
                    // because now jth runner has secured first
                    // place, and in future we don't want to
                    firstPlaceRunner[j] = true;
                    // double count it
                }
            }
        }
    }
    System.out.println("result:");
    System.out.print(counter);
}

Catatan: Sebagai peningkatan pada algoritme kami, Anda dapat menempatkan pernyataan break setelah baris berikut dalam kode karena hanya ada satu pemenang tempat pertama:

firstPlaceRunner[j] = true;
break;

Jadi pada dasarnya, Anda mengatakan bahwa jika kita telah menemukan pelari tempat pertama untuk balapan tertentu, maka jangan periksa pelari lain.

0
Community 7 Januari 2021, 00:12

Anda dapat mengulangi range indeks baris matriks ini, dan filter keluar dari baris tersebut, yang berisi anyMatch dari 1:

int[][] runners = {
        {21, 14, 1, 21, 19, 5, 2},
        {4, 27, 1, 7, 25, 19, 19},
        {12, 20, 25, 11, 30, 14, 15},
        {5, 8, 5, 7, 1, 2, 13},
        {20, 2, 14, 4, 25, 1, 1},
        {14, 20, 20, 15, 11, 18, 16}};

int[] winners = IntStream
        // iterate over indices of
        // the rows of 2d array
        .range(0, runners.length)
        // filer rows where at least
        // one element matches '1'
        .filter(i -> Arrays.stream(runners[i])
                .anyMatch(j -> j == 1))
        // array of indices
        .toArray();

System.out.println(Arrays.toString(winners)); // [0, 1, 3, 4]
0
9 Januari 2021, 18:02

Tambahkan jeda dalam pernyataan if:

public class MyClass {
    public static void main(String[] args) {
        int A[][] = {{21, 14, 1, 21, 19, 5, 2},
                {4, 27, 1, 7, 25, 19, 19},
                {12, 20, 25, 11, 30, 14, 15},
                {5, 8, 5, 7, 1, 2, 13},
                {20, 2, 14, 4, 25, 1, 1},
                {14, 20, 20, 15, 11, 18, 16}};

        int i, j;
        int counter = 0;

        System.out.println("result:");
        for (i = 0; i < 6; i++) {
            for (j = 0; j < 7; j++) {
                if (A[i][j] == 1) {
                    counter++;
                    break;
                }
            }
        }
        System.out.print(counter);
    }
}
-1
Community 12 Januari 2021, 19:33