Laczenie stringow i uzycie stream'ów (zadanie codewars)

0

rozchodzi się o to zadanie
https://www.codewars.com/kata/salesmans-travel/train/java

stworzylem takiego potworka :

public static class Adress {
		public String zipCode;
		public String houseNr;
		public String street;

		public Adress(String adress) {
			String[] values = adress.split(" ");
			String x = "";
			this.zipCode = values[values.length - 2] + " "+ values[values.length - 1];
			this.houseNr = values[0];
			for (int i = 1; i < values.length - 2; i++) {
				x += values[i] + " ";
			}
			this.street = x.substring(0, x.length() - 1);
		}

	}

	public static String travel(String r, String zipcode) {
		String[] singleAdress = r.split(",");
		List<Adress> list = Arrays.stream(singleAdress)
                                .map(Adress::new)
				.filter(adress -> adress.zipCode.equals(zipcode))
				.collect(Collectors.toList());
		String street = "";
		String numer = "";

		for (Adress x : list) {
			street += x.street + ",";
			numer += x.houseNr + ",";
		}

		numer = numer.substring(0, numer.length() - 1);
		street = street.substring(0, street.length() - 1);

		return zipcode + ":" + street + "/" + numer;
	}

i teraz chcialbym uniknac tej petli for do budowania stringow. Czy da sie zbudowac ten return string juz w streamie?

0

A czemu by nie? Będzie tylko dość duży i mało czytelny więc ja bym generalnie zrobił osobną funkcje która zredukuje ten stream adresów do twojego wyniku.
A to oddzielanie przecinkami załatwi ci Collectors.joining(","), nie będzie też wtedy trzeba robic tego substringa.

0

ze ogólnie się da to jestem prawie pewny, mialem na mysli jakies wskazówki, uzylem joining tyle ze siedzi to teraz w 2 funkcjach, w Adress sa gettery

public static String getStreetFromCollection(List<Adress> list) {
		return list.stream().map(Adress::getStreet)
				.collect(Collectors.joining(","));
	}

	public static String getHouseNumerFromCollection(List<Adress> list) {
		return list.stream().map(Adress::getHouseNr)
				.collect(Collectors.joining(","));
	}

	public static String travel(String r, String zipcode) {
		String[] singleAdress = r.split(",");
		List<Adress> list = Arrays.stream(singleAdress).map(Adress::new)
				.filter(adress -> adress.zipCode.equals(zipcode))
				.collect(Collectors.toList());

		return zipcode + ":" + getStreetFromCollection(list) + "/"
				+ getHouseNumerFromCollection(list);
	}

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