Tablice - podstawy

Odpowiedz Nowy wątek
2018-11-30 12:22
0

Jak dokońćzyć takie zadanie . Napisz metodę, która jako argument przyjmuje tablice Stringów. Jako wynik ma zwracać tablice wszystkich słów, które zawierają słowa 5-literowe. Kombinuje coś takiego ale nie wiem co dalej w metodzie, jak dodać elementy do nowej tablicy

public class Main {

    public static String[] mywords(String[] elements) {
        String[] nowatablica = new String[0];
        for (int i = 0; i < elements.length; i++) {
            if (elements[i].length() == 5) {
               CO TUTAJ?
            }
        }
        return nowatablica;

    }

    public static void main(String[] args) {
        String[] tablica = {"alicja", "teresa", "martyna", "halina", "franek", "barbara", "julia"};
        System.out.println(Arrays.toString(mywords(tablica)));
    }
}
edytowany 1x, ostatnio: elzulninho, 2018-11-30 12:22

Pozostało 580 znaków

2018-11-30 13:22
1

Tak na szybko naskrobałem taką propozycję rozwiązania:

import java.util.Arrays;
import java.util.stream.Stream;

public class Words {
    public static void main(String[] args) {
        String[] nonFiveCharLengthWords = new String[] {"1", "12", "1 2", "1 2 3 "};
        String[] fiveCharLengthWords = new String[] {"12345", "abcde", "1 2 3", "a b c"};
        String[] arrayOfWords = Stream.concat(Arrays.stream(nonFiveCharLengthWords), Arrays.stream(fiveCharLengthWords))
                .toArray(String[]::new);

        String[] stringsOfLengthFive = filterArrayByStringLength(arrayOfWords, 5);
        Arrays.asList(stringsOfLengthFive)
                .forEach(System.out::println);
    }

    private static String[] filterArrayByStringLength(String[] arrayToFilter, int lengthOfString) {
        return Arrays.asList(arrayToFilter)
                .stream()
                .filter(word -> word.length() == lengthOfString)
                .toArray(String[]::new);
    }
}

Tylko małe uwagi:

  • Po pierwsze - "tablice wszystkich słów, które zawierają słowa 5-literowe" - jak mamy to interpretować? Kod który napisałem przepuszcza takie przypadki jak 1 2 3 - chociaż zdecydowanie nie można nazwać tego słowem zawierającym 5 liter. Domyślam się że chodziło Ci o Stringi, których długość to pięć znaków, tak?
  • Dobrze jest sparyametryzować wejście funkcji (tak jak zaproponowałem to w moim rozwiązaniu), aby nie było w niej zahardocowane length == 5

Pozostało 580 znaków

2018-11-30 13:22
2

robienie tego na tablicach nie ma za bardzo sensu, bo najprosciej bedzie chyba tak:

public static String[] mywords(String[] elements) {
    return Arrays.stream(elements).filter(s -> s.length() == 5).toArray(String[]::new);
}

lepiej poszukaj jak dziala ArrayList

Ej przestań, przecież chłopak się chce nauczyć tablic, a Ty mu je ukrywasz Streamami. - nie100sowny 2018-11-30 21:46

Pozostało 580 znaków

2018-11-30 13:24
0

Orientuje się jak poszczególne Listy, Sety itp działają ale wymóg zadania niestety był taki żeby zrobić to na tablicach

Pozostało 580 znaków

2018-11-30 13:34
0

No to jeśli koniecznie tylko na tablicach to tak:

import java.util.Arrays;
import java.util.stream.Stream;

public class Words {
    public static void main(String[] args) {
        String[] nonFiveCharLengthWords = new String[] {"1", "12", "1 2", "1 2 3 "};
        String[] fiveCharLengthWords = new String[] {"12345", "abcde", "1 2 3", "a b c"};
        String[] arrayOfWords = Stream.concat(Arrays.stream(nonFiveCharLengthWords), Arrays.stream(fiveCharLengthWords))
                .toArray(String[]::new);

        String[] stringsOfLengthFive = filterArrayByStringLength(arrayOfWords, 5);
        Arrays.asList(stringsOfLengthFive)
                .forEach(System.out::println);
    }

    private static String[] filterArrayByStringLength(String[] arrayToFilter, int lengthOfString) {
        int amountOfWordsWithLength = 0;

        for (int i = 0; i < arrayToFilter.length; i++) {
            if (arrayToFilter[i].length() == lengthOfString) {
                amountOfWordsWithLength++;
            }
        }

        int amountOfWordsInResultArray = 0;
        String[] resultArray = new String[amountOfWordsWithLength];

        for (int i = 0; i < arrayToFilter.length; i++) {
            if (arrayToFilter[i].length() == lengthOfString) {
                resultArray[amountOfWordsInResultArray++] = arrayToFilter[i];
            }
        }

        return resultArray;
    }
}

Ale to rozwiązanie jest żałosne, 2 razy trzeba przeiterować po filtrowanej tablicy - raz aby poznać wielkość wynikowej tablicy i móc ją zainicjalizować, a potem drugi raz aby przypisywać odpowiednie wartości.

Pozostało 580 znaków

2018-11-30 13:37
0

No rzeczywiście, głupi wymóg dali, skoro tak naprawdę to nie jest optymalne...

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0