Konkatenacja bez użycia substringa

Konkatenacja bez użycia substringa
UK
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:78
0

Cześć, czy ktoś wie jak można wyświetlić listę bez użycia metody substring();, żeby na końcu nie było przecinka?

Kopiuj

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

public class Main {

    public static void main(String[] args) {
        
        List<String> companiesList = companiesList();
        String string = "";
        int length = 0;
        for (int i = 0; i < companiesList.size(); i++) {
            string = string + companiesList.get(i) + ", ";
            length = string.length();
        }
        System.out.println(string.substring(0, length - 2));
    }
    private static List<String> companiesList() {
        List<String> companies = new ArrayList<>();
        companies.add("DELL");
        companies.add("APPLE");
        companies.add("SAMSUNG");
        companies.add("SONY");
        companies.add("ALCATEL");
        return companies;
    }
}
Korges
  • Rejestracja:około 5 lat
  • Ostatnio:4 minuty
  • Postów:568
2
Kopiuj
// Util method for strings and other char sequences
List<String> strs = Arrays.asList("1", "2", "3");
String listStr1 = String.join(",", strs);

// For any type using streams and collectors
List<Object> objs = Arrays.asList(1, 2, 3);
String listStr2 = objs.stream()
    .map(Object::toString)
    .collect(joining(",", "[", "]"));

// Using the new StringJoiner class
StringJoiner joiner = new StringJoiner(", ", "[", "]");
joiner.setEmptyValue("<empty>");
for (Integer i : objs) {
  joiner.add(i.toString());
}
String listStr3 = joiner.toString();

https://stackoverflow.com/questions/668952/the-simplest-way-to-comma-delimit-a-list

edytowany 1x, ostatnio: Korges
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:3492
5

W przykładzie jaki masz z pętla mozna to zrobić na dwa sposoby:

  • zamiast złączać napis + przecinek, złączasz przecinek + napis, sprawdzając czy nie jest to ppierwszy element tablicy i czy przecinek należy dodać.

  • tak samo możesz sprawdzić warunek czy jest to ostatni element tablicy i czy przecinek należy dodać. Jeśli łączysz napis i przecinek.

edytowany 2x, ostatnio: jurek1980
UK
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:78
0

@jurek1980: Super! Dziękuję bardzo za pomoc. :)

.andy
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 3 lata
  • Postów:1524
3

Software is like sex: it's better when it's free.
- Linus Torvalds
UK
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:78
0

@.andy: Nie mogę używać, muszę zrobić to jednym ze sposobów jaki podał @jurek1980

.andy
Rozumiem. W takim razie faktycznie metody @jurek1980 są ok. Ja bym jeszcze zrobił wyświetlanie w pętli zwartości stringa po znaku od pierwszego do ostatniego - 1. Wtedy nie wyświetlisz ostatniego przecinka ;) No ale to takie mocno nie fajne rozwiązanie.
UK
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:78
0

@jurek1980: @.andy: Wymyśliłem coś takiego, ale to raczej nie przejdzie...

Kopiuj
package com;

import java.util.*;

public class Main {

    public static void main(String[] args) {

        List<String> companiesList = companiesList();
        String string = "";
        for (int i = 0; i < companiesList.size() - 1; i++) {
            string = string + companiesList.get(i) + ", ";
            if (i == companiesList.size() - 2) {
                string = string + companiesList.get(i + 1);
            }
        }
        System.out.println(string);
    }
    private static List<String> companiesList() {
        List<String> companies = new ArrayList<>();
        companies.add("DELL");
        companies.add("APPLE");
        companies.add("SAMSUNG");
        companies.add("SONY");
        companies.add("ALCATEL");
        return companies;
    }
}
.andy
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 3 lata
  • Postów:1524
0
Kopiuj
    String string = "";
        for (int i = 0; i < companiesList.size() - 1; i++) {
            string = string + companiesList.get(i) + ", ";
            if (i == companiesList.size() - 2) {
                string = string + companiesList.get(i + 1);
            }
        }

Przy takim podejściu za każdym razem tworzysz nowy obiekt typu String. Użyj StringBuilder'a i metodę append.

Wymyśliłem coś takiego, ale to raczej nie przejdzie...

Nie wiem czy to działa ale jak działa to dlaczego, to nie przejdzie?


Software is like sex: it's better when it's free.
- Linus Torvalds
edytowany 1x, ostatnio: .andy
.andy
Sorki przez przypadek nacisnąłem entera ;]
UK
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:78
0

Nie wiem czy to działa ale jak działa to dlaczego, to nie przejdzie?

@.andy: działać to działa, ten pierwszy kod też działa, ale niestety wymagający mentor... może stwierdzić, ze za bardzo przekombinowane i po co ta dwójka etc.
Niestety muszę to zrobić za pomocą pętli i instrukcji warunkowych.

.andy
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 3 lata
  • Postów:1524
0

@Ukulelemelelele: rozumiem.

Chyba jednak rada @jurek1980 będzie najlepsza.

Można np. zrobić metodę String addSeparator(char separator, List<String> list), która przyjmie listę i separator i będzie dodawała do momentu, aż nie trafi na ostatni element listy.
Czyli iterujesz po liście i dodajesz separator chyba, że napotkasz na ostatni element listy.


Software is like sex: it's better when it's free.
- Linus Torvalds
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:27 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
2

Święta prawda mówi lepiej sprawdzać przód listy niż tył, zrobisz mniej ifów

Kopiuj
import java.util.*;

public class WriteOnlyPL {
    public static void main(String[] args) {
        final List<String> companiesList = companiesList();
        final String value = myJoin(companiesList);
        System.out.println(value);
    }
    public static String myJoin(List<String> list) {
        final int size = list.size();
        if (size == 0) return "";
        if (size == 1) return list.get(0);
        
        final StringBuffer buffer = new StringBuffer(list.get(0));
        for (int i = 1; i < size; ++i) {
            buffer.append(", ").append(list.get(i));
        }
        return buffer.toString();
    }
    private static List<String> companiesList() {
        List<String> companies = new ArrayList<>();
        companies.add("DELL");
        companies.add("APPLE");
        companies.add("SAMSUNG");
        companies.add("SONY");
        companies.add("ALCATEL");
        return companies;
    }    
}

Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 2x, ostatnio: KamilAdam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.