java - разбить строку по длине, сохранив подстроки целыми - PullRequest
0 голосов
/ 03 апреля 2020

Я разбил строку «это тест для строки длиннее, чем» на подстроки длиной 7 (или меньше), поэтому у меня есть список strList, который выглядит следующим образом: [это, является, тест, для, thestri, нг, длиннее, чем]

мне нужно распечатать это в строках длиной 7, сохраняя подстроки целыми: [это тест, для, thestri, нг, длиннее, чем]

но я получаю это вместо этого, и я не могу найти ошибку [это, это, тест, потому что, больше, дольше, чем, семь, charact, ers]

так, что я ' Я пытаюсь сделать, это получить длину подстроки и сравнить ее с пределом в 7 символов (L1), а если он меньше L1 - взять следующую подстроку и добавить ее в ту же строку (предоставляя сумму их длин + пробел между ними). все еще 7 или меньше). затем в список добавляются новые строки strList2

package mylessons;
import java.util.*;

public class Level160 {

    public static void main(String[] args) {
         int L1 = 7; // length limit
         int len1 = 0;
         String tmpStr1 = "";
         List<String> strList = new ArrayList<>();
         List<String> strList2 = new ArrayList<>();

         strList.add("this");
         strList.add("is");
         strList.add("a");
         strList.add("test");
         strList.add("for");
         strList.add("thestri");
         strList.add("ng");
         strList.add("longer");
         strList.add("than");
         System.out.println(strList);

         for (int k = 0; k < strList.size(); k++ ) {

                // substring is shorter than L1 - 1 -->> adding to tmpStr1
                if (strList.get(k).length() + len1 < L1 - 1) {
                    tmpStr1 = tmpStr1 + strList.get(k).toString() + " ";
                    len1 = (len1 + strList.get(k).length() + 1);
                }

                // substring is L - 1 (whitespace is last char) -->> adding to tmpStr -->> adding to strList2
                if (strList.get(k).length() + len1 == L1 - 1) {
                    tmpStr1 = tmpStr1 + strList.get(k).toString();
                    strList2.add(tmpStr1);
                    len1 = 0;
                    tmpStr1 = "";
                }

                // substring is L -->> adding to tmpStr -->> adding to strList2
                if (strList.get(k).length() + len1 == L1) {
                    tmpStr1 = tmpStr1 + strList.get(k).toString();
                    strList2.add(tmpStr1);
                    len1 = 0;
                    tmpStr1 = "";
                }

                if (strList.get(k).length() + len1 > L1) {
                    strList2.add(strList.get(k));
                }
            }
            System.out.println(strList2);
    }
}

любая помощь приветствуется:)

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

хорошо, так что я сделал некоторые корректировки, так что это рабочий кусок кода, который вы можете использовать :) также я добавил проверку, что последняя подстрока в данной строке короче указанного ограничения длины.

Список до: [это, тест, для, thestri, нг, длиннее, чем] Список после: [это, тест, для, thestri, нг, длиннее, чем]

public static void main(String[] args) {
     int L1 = 7; // length limit
     int len1 = 0;
     String tmpStr1 = "";
     List<String> strList = new ArrayList<>();
     List<String> strList2 = new ArrayList<>();

     strList.add("this");
     strList.add("is");
     strList.add("a");
     strList.add("test");
     strList.add("for");
     strList.add("thestri");
     strList.add("ng");
     strList.add("longer");
     strList.add("than");
     System.out.println(strList);

     for (int k = 0; k < strList.size(); k++ ) {

            // last substring is shorter than L1
            if (strList.get(k).length() + len1 < L1 - 1 && k == strList.size() - 1) {
                strList2.add(strList.get(k));
                continue;
            }

            // substring is shorter than L1 -->> adding to tmpStr1
            if (strList.get(k).length() + len1 < L1 - 1) {
                tmpStr1 = tmpStr1 + strList.get(k).toString() + " ";
                len1 = (len1 + strList.get(k).length() + 1);
                continue;
            }

            // substring is L - 1 (whitespace is last char) -->> adding to tmpStr -->> adding to strList2
            if (strList.get(k).length() + len1 == L1 - 1) {
                tmpStr1 = tmpStr1 + strList.get(k).toString();
                strList2.add(tmpStr1.trim());
                len1 = 0;
                tmpStr1 = "";
            }

            // substring is L -->> adding to tmpStr -->> adding to strList2
            if (strList.get(k).length() + len1 == L1) {
                tmpStr1 = tmpStr1 + strList.get(k).toString();
                strList2.add(tmpStr1.trim());
                len1 = 0;
                tmpStr1 = "";
            }

            if (strList.get(k).length() + len1 > L1) {
                strList2.add(tmpStr1.trim());
                strList2.add(strList.get(k));
                len1 = 0;
                tmpStr1 = "";
            }

        }
        System.out.println(strList2);
}
0 голосов
/ 03 апреля 2020

В первой итерации вы сталкиваетесь с первым предложением if и со вторым. Но второе условие if не очищает tmpStr1. Возможно, это не единственная проблема с вашим кодом, но это намекает на две вещи, которые вы должны попытаться сделать, исправляя код, на мой взгляд:

  • Убедитесь, что вы выполняете ровно одно условие if в каждой итерации.
  • Очистите tmpStr1 и len1 каждый раз, когда вы добавляете что-то в strList2.
...