Łączenie łańcuchów tekstowych

0

Mam do napisania metodę, który połączy dowolną ilość argumentów używając pierwszego argumentu jako separatora/łącznika. Do tej pory napisałem coś takiego:

public class SumowanieString {
	
	
	  public static String lacz(String ... args)
	  {

		String lancuch = "";
    	for (String n : args) {
    		
    		lancuch = lancuch+ args[0]+n;

    	}
    	return lancuch;    	

	  }
		

	
	  public static void main(String[] args) {
		  
		  System.out.println(lacz(" " , "Ala" , "ma" , "kota" ) ); // Ala ma kota
		  System.out.println(lacz("+" , "2" , "2" ) ); // 2+2
		  System.out.println(lacz("lacznik") ); //

		  }
	  }	 

Co jednak w efekcie daje:

   Ala ma kota
+++2+2
laczniklacznik

Czyli łącznik działa, ale poza samym łączeniem pojawia się również na początku łancucha. Gdzie leży błąd ?

0

bo tak wygląda Twój kod. Do pustego dodajesz separator a potem drugi argument - więc działa poprawnie. Żeby było zabawniej, korzystasz z for(eacha) przez co nie panujesz nad iteracjami. W pierwszej iteracji robisz łańcuch + separator + pierwszy element args - czyli kolejny separator - a ktolejna iteracja co robi?? dodaje jeszcze jeden separator! Dlatego masz trzy plusy Ci się pojawiły i trzy białe spacje oraz podwojony licznik. Uczymy się analizować własny kod, i interpretować pętle;]
Nie korzystaj nigdy z tego typu pętli, jeżeli nie potrzebujesz iterować przez wszystkie elementy tablicy (a tutaj prawie że nie możesz!). Nie utrudniaj sobie życia idąc na łatwiznę :P
jak już to zrób taką konkatenacje

lancuch=""
....

for(int i=1;i<args.length;i++)
{
    lancuch+=args[i];
   if(i==args.length-1) break;//jeżeli ostatni element nie dodawaj separatora
   lancuch+=args[0];
}

teraz jeżeli nie będzie żadnych argumentów to łańcuch będzie pusty, jeżeli będzie jeden element to tylko on będzie zwrócony a dla większej ilości elementów, separatory będą tam gdzie powinny być

1

Dodam, że nie powinno się do łączenia Stringów używać operatora konkatenacji.

//ten kod
        StringBuilder zwrot=new StringBuilder("");
        for (int i=1;i<=100000;i++)
        {
            zwrot.append("A");
        }
//jest około 9 tysięcy razy szybszy niż ten
        String zwrot="";
        for (int i=1;i<=100000;i++)
        {
            zwrot+="A";
        }
0

Możesz też separator uczynić osobnym argumentem, jako że wywołanie lacz() (z pustą listą argumentów) nie ma sensu, w dodatku pozwoli to też na proste użycia metody tam, gdzie nie chcemy używać varargsów:

public static String lacz(String separator, String... args) {
    if (args.length == 0) {
        return "";
    }
    StringBuilder builder = new StringBuilder(args[0]);
    for (int i = 1; i < args.length; i++) {
        builder.append(separator).append(args[i]);
    }
    return builder.toString();            
}

public static void main(String[] args) {
    System.out.println(lacz(" ", "Ala", "ma", "kota"));  // Ala ma kota
    System.out.println(lacz("+", "2", "2"));             // 2+2
    System.out.println(lacz("lacznik"));                 //

    // Nie jest możliwe w twojej wersji:
    String[] strings = {"aaa", "bbb", "ccc"};
    System.out.println(lacz("~", strings));              // aaa~bbb~ccc
}
0
public class App {

	public static void main(String[] args) {
		String[] tab = { ",", "Ala", "ma", "kota" };
		String separator = tab[0];
		String[] words = Arrays.copyOfRange(tab, 1, tab.length);
		System.out.println(join(words, separator));
		System.out.println(join(new String[0], separator));
	}

	private static String join(String[] words, String separator) {
		StringBuilder builder = new StringBuilder();
		for (String s : words)
			builder.append(s).append(separator);
		return builder.substring(0, builder.length() > 0 ? builder.length() - 1
				: 0);
	}
}

Poza brzydkim Elvisem w ostatniej linii zdaje się być OK....

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