Java: разбить массив строк, отсортированных по длине строки на несколько массивов по длине строки - PullRequest
2 голосов
/ 29 апреля 2020

У меня в настоящее время есть массив строк, который сортируется по длине строки, например:

String[] array = [a,b,c,ab,cd,abc,abcde,fghij,klmno]

Как превратить этот массив в несколько массивов в зависимости от размера строки, при этом отслеживая, какой размер строки для каждого массив есть? То, что я хочу, это:

String[] array1 = [a,b,c]
String[] array2 = [ab,cd]
String[] array3 = [abc]
String[] array5 = [abcde,fghij,klmno]

Возможно, я думал об использовании матрицы для этого, но не имею ни малейшего представления о том, чтобы сделать это.

Ответы [ 5 ]

2 голосов
/ 29 апреля 2020

Лучше создать Map<Integer, List<String>>, где ключ - это длина строки, а значение - список строк размером с similair.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SimpleArray {

    public static void main(String[] args) {
        String[] array = new String[]{"a","b","c","ab","cd","abc","abcde","fghij","klmno"};

        Map<Integer, List<String>> map = new HashMap<>();

        for (int i = 0; i < array.length; i++) {
            List< String> temp = map.getOrDefault(array[i].length(),new ArrayList<>());
            temp.add(array[i]);
            map.put(array[i].length(),temp);
        }
        System.out.println(map);

    }
}

1 голос
/ 30 апреля 2020

Вы можете использовать Map, чтобы связать длины строк с вложенным массивом строк этой длины:

String[] array = {"a", "b", "c", "ab", "cd", "abc", "abcde", "fghij", "klmno"};

Map<Integer, String[]> map = new HashMap<>();

for(int j=0, i=1; i<=array.length; i++)
{
    if(i == array.length || array[i].length() > array[j].length())
    {
        map.put(array[j].length(), Arrays.copyOfRange(array, j, i)) ;
        j = i;
    }
}

for(Integer len: map.keySet())
    System.out.format("%d : %s%n", len, Arrays.toString(map.get(len)));

Вывод:

1 : [a, b, c]
2 : [ab, cd]
3 : [abc]
5 : [abcde, fghij, klmno]
1 голос
/ 30 апреля 2020

Использование Система: arraycopy

Решение с использованием только массивов:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[][] arraysList = new String[1][];
        String[] array = { "a", "b", "c", "ab", "cd", "abc", "abcde", "fghij", "klmno" };
        int srcPos, row = 0;
        for (int i = 0; i < array.length; i++) {
            srcPos = i;
            while (i < array.length - 1 && array[i].length() == array[i + 1].length()) {
                i++;
            }
            // Create a new array to store the current set of strings of equal length
            String[] subarray = new String[i - srcPos + 1];

            // Copy the current set of strings of equal length from array to subarray[]
            System.arraycopy(array, srcPos, subarray, 0, subarray.length);

            // Assign subarray[] to arraysList[][]
            arraysList[row++] = subarray;

            // Copy arraysList[][] to temp [][], increase size of arraysList[][] and restore
            // arrays from temp [][] to arraysList[][]
            String[][] temp = arraysList;
            arraysList = new String[row + 1][subarray.length];
            for (int j = 0; j < temp.length; j++) {
                arraysList[j] = temp[j];
            }
        }

        // Drop the last row which was created to store a new subarray but there was no
        // more subarrays to store and therefore it is empty.
        arraysList = Arrays.copyOf(arraysList, arraysList.length - 1);

        // Display the subarrays
        for (String[] arr : arraysList) {
            System.out.println(Arrays.toString(arr));
        }
    }
}

Выход:

[a, b, c]
[ab, cd]
[abc]
[abcde, fghij, klmno]

Решение с использованием List и массива:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String[]> list = new ArrayList<String[]>();
        String[] array = { "a", "b", "c", "ab", "cd", "abc", "abcde", "fghij", "klmno" };
        int srcPos;
        for (int i = 0; i < array.length; i++) {
            srcPos = i;
            while (i < array.length - 1 && array[i].length() == array[i + 1].length()) {
                i++;
            }
            String[] subarray = new String[i - srcPos + 1];
            System.arraycopy(array, srcPos, subarray, 0, subarray.length);
            list.add(subarray);
        }

        // Display the subarrays
        for (String[] arr : list) {
            System.out.println(Arrays.toString(arr));
        }
    }
}

Выход:

[a, b, c]
[ab, cd]
[abc]
[abcde, fghij, klmno]
1 голос
/ 30 апреля 2020

Мое решение - это , такое же, как у @ QuickSilver, но гораздо менее ясно . Теперь, когда я здесь, я тоже размещаю свой, потому что я посвятил этому время, но повторюсь, я рекомендую следовать его.

КОД

public static void main(String[] args) {
        String[] array = {"a", "b", "c", "ab", "cd", "abc", "abcde", "fghij", "klmdfwetdfgdfgdfgdg"};
        HashMap<Integer, List<String>> hashMap = new HashMap<>();
        int strLength = array[0].length();

        for (String s : array) {
            while (true) {
                if (s.length() == strLength) {
                    if (hashMap.get(strLength) != null) {
                        List<String> temp = hashMap.get(strLength);
                        temp.add(s);
                        hashMap.put(strLength, temp);
                    } else {
                        List<String> strings = new LinkedList<>();
                        strings.add(s);
                        hashMap.put(strLength, strings);
                    }
                    break;
                } else
                    strLength = s.length();
            }
        }
        System.out.println(hashMap);
    }
1 голос
/ 29 апреля 2020

Для быстрого доступа вы также можете использовать список списков.

String[] array = new String[]{"a","b","c","ab","cd","abc","abcde","fghij","klmno"};
List<List<String>> lists = new LinkedList<>();

// you will have to update this number based on the maximum length of string you are expecting
for (int i = 0; i < 6; i++) {
    lists.add(new LinkedList<>());
}

for (String a: array) {
    lists.get(a.length()).add(a);
}

System.out.println(lists);

Здесь первый список соответствует размеру, а внутренний список - фактическим строкам.

Примечание: это только для небольших строк. Если у вас есть строки длиной 1, 2, 100. Вероятно, вы должны go с HashMaps, потому что при таком подходе у вас будет тратить много памяти.


Использование Java8:

String[] array = new String[]{"a","b","c","ab","cd","abc","abcde","fghij","klmno"};

List<List<String>> lists = IntStream.range(0, 6).<List<String>>mapToObj(
    i -> new LinkedList<>()).collect(Collectors.toCollection(LinkedList::new));

Arrays.stream(array).forEach(a -> lists.get(a.length()).add(a));

System.out.println(lists);
...