2015-06-04 3 views
-3

Я пытаюсь написать функцию, которая объединяет две строки, используя приведенные ниже правила.Java, объединяющий две строки

  1. Символы в строке берутся по очереди (первая строка первого символа, второй строки первого символа, первая строка второго символа и так далее): «JV» + «аа» = «Java».

  2. Если короткая строка доходит до конца, все символы из другой строки добавляются в конец строки, которая уже завершена: «h» + «ello» = «привет».

это то, что я до сих пор:

public static void main(String[] args) { 
     String aa = "jv"; 
     String bb = "aa"; 
     System.out.println(combineStrings(aa, bb)); 


} 
    public static String combineStrings(String aa, String bb) { 

    String newstring; 
    if(aa.length() > bb.length()){ 

     for(int i = 0; i < aa.length(); i++){ 

      newstring = aa.substring(i, 1) + bb.substring(i, 1); 

     } 

    } else { 


    } 


    return newstring; 
} 
+1

И каков ваш вопрос? – Holger

+1

... и вопрос? –

+0

Что дальше вы хотите знать ??? – CoderNeji

ответ

0

newstring не инициализирован на всех контрольных точках. (Блок else пуст).

Java не позволяет этого и информирует вас об этом.

Одним из решений является написать String newstring = null; и правильно обработать строку null в вашем коде.

3

так инициализировать его

String newstring = ""; 
1

Как правило, для такого рода String манипуляции с использованием рекомендуется StringBuilder:

public static String combineStrings(String aa, String bb) { 
    StringBuilder sb=new StringBuilder(aa.length()+bb.length()); 
    int common=Math.min(aa.length(), bb.length()); 
    for(int ix=0; ix<common; ix++) 
     sb.append(aa.charAt(ix)).append(bb.charAt(ix)); 
    String longer=aa.length()>bb.length()? aa: bb; 
    sb.append(longer, common, longer.length()); 
    return sb.toString(); 
} 
+0

Удобное решение! – Gosu

+0

Я тестировал его, отлично работает. Я пытаюсь думать об этом до сих пор, этот код для меня следующий уровень, я новичок. – firemode12

+0

Правильно изучите код и проверьте [документацию] (http://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html), и вы можете узнать что-то, что поможет решить другие связанных с проблемой. – Holger

0

Ваш подход, вероятно, не будет работать. Вы можете создать цикл for с циклом индекса, начинающимся с 0. В цикле получите символ из обеих строк в позиции индекса и добавьте их к вашему результату в правильном порядке. Результатом не должно быть String, а StringBuilder, чтобы избежать интернирования всех промежуточных результатов String. Если какая-либо из строк ввода заканчивается, добавьте оставшуюся часть другой строки и выйдите из цикла.

1

Необходимо сначала инициализировать newString в качестве пустой строки.

public class CombineStrings { 

    public static void main(String[] args) { 
     String aa = "aaaaa111"; 
     String bb = "bbbbb"; 
     System.out.println(combineStrings(aa, bb)); 
    } 

    public static String combineStrings(String aa, String bb) { 

     int shorterLength = (aa.length() >= bb.length()) ? 
       bb.length() : aa.length(); 

     // Initialize newString as empty string 
     String newString = ""; 

     for (int i = 0; i < shorterLength; i++) { 
      newString += aa.charAt(i) + "" + bb.charAt(i); 
     } 

     newString += (aa.length() > bb.length()) ? 
        aa.substring(shorterLength) : 
         bb.substring(shorterLength); 

     return newString; 
    } 
} 

Более оптимальным решением было бы использовать вместо StringBuilder!

+0

Хотя ваше решение должно работать, вы должны использовать StringBuffer. Конкатенация строк медленная. – Aakash

+0

@Aakash Да, я полностью согласен с тем, что это будет еще лучшее решение! Если вы имеете в виду, StringBuilder. – Gosu

+1

На самом деле вы должны использовать StringBuilder, а не StringBuffer. – Puce

0

Если я правильно понял, вам нужна функция, чтобы присоединиться к строкам в соответствии с вашим требованием. Ниже следует решить вашу проблему

public static String combineStrings(String aa, String bb) { 
    int lenA, lenB, min; 
    lenA = aa.length(); 
    lenB = bb.length(); 
    min = Math.min(lenA, lenB); 
    StringBuilder builder = new StringBuilder(); 
    for(int i = 0; i < min; i++){ 
     builder .append(aa.charAt(i)); 
     builder .append(bb.charAt(i)); 
    } 
    if(min < lenA) 
     builder .append(aa.substring(min)); 
    if(min < lenB) 
     builder .append(bb.substring(min)); 

    return builder .toString(); 
} 
+2

Если вам не нужна совместимость с Java 1.4, предпочтительнее использовать 'StringBuilder', а не' StringBuffer'. Кроме того, вы добавляете * номер *, а не оставшуюся строку в конце, которая предполагает, что вы действительно не протестировали свой код ... – Holger

+0

абсолютно правильно. Спасибо @ Хольгер. Да, у меня не было возможности проверить мой код, потому что у меня есть новая машина и все еще настраиваю это. Виноват. – Aakash

0

Просто для удовольствия, здесь рекурсивный вариант:

public static String combineStrings(String a, String b) { 
    if (a.length() > 0 && b.length() > 0) { 
     return "" + a.charAt(0) + b.charAt(0) 
       + combineStrings(a.substring(1), b.substring(1)); 
    } else { 
     return a + b; 
    } 
} 

Для повышения производительности вы должны пойти с раствором Хольгер (который я уже до проголосовали).

Смежные вопросы