Konkatenacja bez użycia substringa

0

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


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;
    }
}
2
// 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

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.

0

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

0

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

0

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

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;
    }
}
0
    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?

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.

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.

2

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

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;
    }    
}

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