String majmuasini mag'lubiyatga birlashtirgan usul

Yaxshi, shuning uchun men bir qator mag'lubiyatga oid qatorlardan mag'lubiyat yaratish haqida qayg'uraman. 3 string majmuasini qabul qiladigan bu usul mavjud

public static String formatStory(String[] shortest, String[] medium, String[] longest){

    return formattedStory;
}

Uzoq so'zni, o'rta so'zni va qisqa so'zni qabul qilmoqchiman, uni stringga qo'shib qo'yaman, so'ngra daftarni takrorlashni takrorlang. Men qancha vaqt oralig'ida o'ynashni bilmayman, chunki men bir muddat loop foydalanarmidim? Yoki loops uchun?

0
Bu qanday til? Men C# ni taxmin qilyapmanmi? O'zingizning savollaringizni til bilan solishtirib, tegishli mutaxassislar unga javob berishi mumkin. Bundan tashqari, usulning imzosini yozishdan tashqari, nima qilishga harakat qildingiz? Uni hal qilish uchun boshqa biror narsaga harakat qildingizmi?
qo'shib qo'ydi muallif Sean Werkema, manba

6 javoblar

Siz loop yoki while-loopdan foydalanishingiz mumkin, chunki ikkala loop ham bir qator shartlarni oladi, bu esa massivlarning uzunligi bo'ladi. Bitta loop faqat uchta string majmuasini bir xil o'lchamga ega bo'lsa, ishlaydi, aks holda uni optimallashtirilgan ishlash uchun turli usullar bilan yozishingiz kerak. Yaxshi xotira ishlashi uchun birlashma o'rniga StringBuilder-dan foydalaning.

1
qo'shib qo'ydi
while() va for() oralig'ida Java o'rtasida farq yo'q. bytecode bir xil: stackoverflow.com/a/8880898/4985572 . Umuman, JDK 1.6 va undan yuqori derazadan foydalanib, StringBuilder yordamida avtomatik ravishda strillerni birlashtiradi. Biroq, looplarda StringBuilder dan foydalaning, albatta, yaxshi! stackoverflow.com/a/14927864/4985572
qo'shib qo'ydi muallif Igoranze, manba

Bu oddiy narsa emas va men uni birgina loop yordamida hal qilish mumkinligiga ishonchim komil emas. Men uchun bu vazifani bajarish uchun foreach-loopning ikkita funktsiyasini va java ekvivalentini oldi. Shuningdek, ro'yxatlarni ishlatishni taklif qilaman. Birinchidan, uch qatordan so'zlarni pozitsiyalarga ko'ra guruhlashingiz kerak. Va ikkinchidan, natijada iplar biriga birlashtirilishi kerak. Quyidagi kodni tekshiring.

import java.util.*;

/*Some code...*/

private static void insertArrayIntoList(List items, String[] array) {
    if(array == null) return;
    int count = 0;
    for(String item : array) {
        if(items.size() > count) {
            String temp = items.get(count);
            temp += " " + item;         
            items.set(count, temp);
        } else {
            items.add(item); 
        }
        count++;
    }
}
public static String formatStory(String[] shortest, String[] medium, String[] longest){ 

    List items = new ArrayList();

    insertArrayIntoList(items, shortest);
    insertArrayIntoList(items, medium);
    insertArrayIntoList(items, longest);

    String formattedStory = "";
    for(String item : items) {
       formattedStory += ((formattedStory.length() == 0) ? "" : " ") + item;                          
    }
    return formattedStory;
}
0
qo'shib qo'ydi

"Tez va iflos" (imo) yechimi shunday bo'lar edi:

public static String formatStory(String[] shortest, String[] medium, String[] longest) {

    int s = shortest.length;
    int m = medium.length;
    int l = longest.length;

    int max = Integer.max(s, Integer.max(m, l));

    StringBuilder result = new StringBuilder();

    for (int i = 0; i < max; i++) {
        if (i < l)
            result.append(longest[i]).append(" ");
        if (i < m)
            result.append(medium[i]).append(" ");
        if (i < s)
            result.append(shortest[i]).append(" ");
    }

    return result.toString().trim();
}

Which simply takes the length of the biggest array, loops (for loop for index) over all arrays, looks, if there is still an element left in the array (index < length) and appends it. You can also use String and simply append it with + if this fits your style more.

0
qo'shib qo'ydi

Vaqt, lekin har iterasyonda ishonch hosil qiling, sizda barcha 3 ta satr qadriyatlar mavjud. Bu juda yuqori xotira va CPU foydalanish funktsiyasi, siz uni qanday qilib optimallashtiradi deb o'ylashingiz mumkin.

Umid qilamanki yordam beradi.

0
qo'shib qo'ydi
while() va for() oralig'ida java o'rtasida farq yo'q. bytecode bir xil: stackoverflow.com/a/8880898/4985572
qo'shib qo'ydi muallif Igoranze, manba

Bundan tashqari, for loop ham foydalanishingiz mumkin.

String s = "";
for (int i = 0; i < shortest.length; i++) {
  s = s + longest[i] + medium[i] + shortest[i];
}
return s;
0
qo'shib qo'ydi
Ha, bu xat yozildi. Tahrirlash uchun rahmat
qo'shib qo'ydi muallif Adeel, manba
Biz sarmoya "S" bilan string yozamiz, umid qilamanki ...
qo'shib qo'ydi muallif NewBie1234, manba

Qaysi qator eng qisqa ekanligiga ishonch hosil qilmasangiz, avval uni tekshirishingiz mumkin, buni topgach, for loop ni yaratishingiz mumkin, shunda har doim ham eng past qiymatli uch qatordan eng zaif bo'laklardan ... shunga o'xshash:

 private static void doStackOverflow() {
     String[] shortest = {"one", "two", "three", "four"};
     String[] medium = {"a", "b", "c", "d", "e", "f"};
     String[] longest = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};

     System.out.println(formatStory(shortest, medium, longest));
 }

 public static String formatStory(String[] shortest, String[] medium, String[] longest) {

     int weakestLink = findWeakestLink(shortest.length, medium.length, longest.length);

     String formattedStory = "";
     for (int i = 0; i < weakestLink; i++) {
         formattedStory += shortest[i] + " " + medium[i] + " " + longest[i] + " ";
     }

     return formattedStory;
 }

 private static int findWeakestLink(int shortest, int medium, int longest) {
     int result = shortest + medium + longest;

     if (shortest < result)
         result = shortest;
     if (medium < result)
         result = medium;
     if (longest < result)
         result = longest;

     return result;
 }
0
qo'shib qo'ydi