Tworzę program, który odczytuje wiersze z różnych plików tekstowych i dodaje je do jednej tablicy dla każdego pliku. W pewnym momencie muszę połączyć wszystkie te tablice, a następnie wybrać z nich losowy element. To jest kod, który próbowałem do tej pory, niestety nie wypełnia poprawnie tablicy :

private static String[] concat(ArrayList<String[]> arrays)
{
    int length = 0;

    for (String[] array : arrays)
        length += array.length;

    String[] first = arrays.get(0);
    String[] result = Arrays.copyOf(first, length);

    for (int i = 1; i < arrays.size(); i++)
    {
        String[] array = arrays.get(i);
        System.arraycopy(array, 0, result, arrays.get(i - 1).length, array.length);
    }

    return result;
}

Myślę, że psuję parametry System.arraycopy, ale nie jestem pewien. Co jest nie tak z moim kodem?

1
ShiningLea 20 czerwiec 2021, 22:28

4 odpowiedzi

Najlepsza odpowiedź

Tak, problem dotyczy parametru destPos, spróbuj:

private static String[] concat(List<String[]> arrays) {
    int length = 0;

    for (String[] array : arrays)
        length += array.length;

    String[] first = arrays.get(0);
    String[] result = Arrays.copyOf(first, length);

    int index = first.length;

    for (int i = 1; i < arrays.size(); i++) {
        String[] array = arrays.get(i);
        System.arraycopy(array, 0, result, index, array.length);
        index += array.length;
    }

    return result;
}
1
George Lvov 20 czerwiec 2021, 19:45
private static String[] concat(List<String[]> arrays) {
    int length = 0;

    for (String[] array : arrays)
        length += array.length;

    String[] result = new String[length];
    int offs = 0;

    for (String[] arr : arrays) {
        System.arraycopy(arr, 0, result, offs, arr.length);
        offs += arr.length;
    }

    return result;
}
0
oleg.cherednik 20 czerwiec 2021, 19:55

Nie jestem pewien, czy to będzie przydatne, ale przypomniało mi to program, który wcześniej napisałem jako przykład, który używa metod, które pobierają dwie tablice i łączą je w jedną. Brzmi podobnie do tego, czego szukasz. Jeśli to działa, po prostu wygeneruj losową liczbę na podstawie długości i odnieś się do tego indeksu.

public static String[] combineArrays(String[] a1, String[] a2) 
{
    // Get the size of each array
    int length1 = a1.length;
    int length2 = a2.length;
    int size = length1 + length2;
    
    String[] combinedArray = new String[size];
    
    // Load the first array into the combined array starting from the end
    // of the first 
    // Start at length of the first array and end at the total size
    for(int i = 0; i < a1.length; i++) {
        combinedArray[i] = a1[i];
    }
    
    // Keeps track of where we are in a2 
    int current = 0;
    // Load second array into combined array
    for (int j = length1; j < size; j++) {
        combinedArray[j] = a2[current];
        current++;
    }
    
    return combinedArray;
}
0
Jamez 20 czerwiec 2021, 19:43

Sugerowałbym podejście strumieniowe zamiast radzenia sobie i obliczania długości tablicy. Coś jak:

private static String[] concat(ArrayList<String[]> arrays){
    return arrays.stream().flatMap(Arrays::stream).toArray(String[]::new);
}
1
Eritrean 20 czerwiec 2021, 19:45