Помогите List<String> - при достижении максимального количества символов - смещение

Статус
Закрыто для дальнейших ответов.

CriticaMobslps

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Votybo
Написал на Java для примера
Суть в том что когда например на строке 15 символов то мы смещаем следующее предложение на строку ниже(Нужно в Lore)
По сути уже код есть но работает криво
PHP:
public class TestClass
{

    public static void main(String[] str)
    {
        int maxLength = 15;
        List<String> stringList = Arrays.asList (
                "Тут сообщение номер 1 и пусть ещё несколько букв",
                "Тут сообщение номер 2 и пусть ещё несколько букв",
                "Тут сообщение номер 3 и пусть ещё несколько букв");
        System.out.println (method(stringList, maxLength));
    }

    public static List<String> method(List<String> w, int maxLength)
    {
        List<String> result = new ArrayList<> ();
        result.add ("");
        for(int i = 0; i < w.size (); i++) {
            String text = w.get (i);
/*
            String endLine = text.split (" ")[text.split (" ").length-1];
*/
            String endLine = "";
            String latestLine = text.split (" ")[text.split (" ").length - 1];
            int latestLength;
            for (String message : text.split (" ")) {
                latestLength = endLine.length ();
                if ((latestLength + message.length ()) > maxLength) {
                    System.out.println ("Размер сообщения: " + (latestLength + message.length ()) + ", сообщение перенесено на новую строку");
                    System.out.println ("Сообщение: " + endLine + " AND " + message);
                    if(latestLine.equalsIgnoreCase (message)){
                        System.out.println ("Попробуем");
                    }else{
                        endLine = message;
                        continue;
                    }
                }
                endLine += " " + message;
                if((result.size () - 1) > 0){
                    setLine(result, message, maxLength, endLine);
                    System.out.println (result.get (result.size () - 1));
                }else{
                    result.add (endLine);
                }
            }

        }
        return result;
    }

    private static void setLine(List<String> result, String message, int maxLength, String endLine){
        if((result.get (result.size () - 1).length () + message.length ()) < maxLength)
        {
            result.set (result.size () - 1, endLine);
        }else{
            result.add (endLine);
        }
    }


}
PHP:
[,  Тут сообщение, номер 1 и пусть, ещё несколько, ещё несколько букв,  Тут сообщение, номер 2 и пусть, ещё несколько, ещё несколько букв,  Тут сообщение, номер 3 и пусть, ещё несколько, ещё несколько букв]

Просто устал разбираться в этом один, вдруг есть способ по проще это всё делать
 
Много гемора у тебя вылезает из-за того что ты тут пытаешься лист модифицировать по индексу что не имеет смысла. Пихай в новый лист уже разделённые строчки и скомпонованные строчки. Так сразу половина кода исчезнет, и не надо будет оффсетить индексы. По сути ты должен резать строчку и добавлять её пока она больше лимита. И только когда она уже меньше, её можно запомнить, и на следующей итерации склеить с другой, и снова повторить алгоритм. После итерации всё что осталось тоже подпихнуть в список.
 
Код:
    public static List<String> split(String st, int spl) {
        String[] arrWords = st.split(" ");
        ArrayList<String> list = new ArrayList<String>();
        StringBuilder sb = new StringBuilder();
        int index = 0;
        int length = arrWords.length;
        while (index != length) {
            if (sb.length() + arrWords[index].length() <= spl) {
                sb.append(arrWords[index]).append(" ");
                index++;
            } else {
                list.add(sb.toString().trim());
                sb.setLength(0);
            }
        }
        if (sb.length() > 0) {
            list.add(sb.toString());
            sb.setLength(0);
        }
        return list;
    }
 
Последнее редактирование:
Код:
    public static List<String> split(String st, int spl) {
        String[] arrWords = st.split(" ");
        ArrayList<String> list = new ArrayList<String>();
        StringBuilder sb = new StringBuilder();
        int index = 0;
        int length = arrWords.length;
        while (index != length) {
            if (sb.length() + arrWords[index].length() <= spl) {
                sb.append(arrWords[index]).append(" ");
                index++;
            } else {
                list.add(sb.toString().trim());
                sb.setLength(0);
            }
        }
        if (sb.length() > 0) {
            list.add(sb.toString());
        }

        sb = null;
        return list;
    }
Во, хорошая имплементация (Только занулять sb в конце нет необходимости, в java не refcount gc, а live object pool, ссылка локальной переменной один фиг из корней исчезнет по выходу из метода). Но поскольку автору на входе нужен список строк, то нужно будет перед этим ещё объединить список строк в одну.
 
Во, хорошая имплементация (Только занулять sb в конце нет необходимости, в java не refcount gc, а live object pool, ссылка локальной переменной один фиг из корней исчезнет по выходу из метода). Но поскольку автору на входе нужен список строк, то нужно будет перед этим ещё объединить список строк в одну.
Ну это уже на изи
Код:
    public static List<String> split(String st, int spl) {
        String[] arrWords = st.split(" ");
        ArrayList<String> list = new ArrayList<String>();
        StringBuilder sb = new StringBuilder();
        int index = 0;
        int length = arrWords.length;
        while (index != length) {
            if (sb.length() + arrWords[index].length() <= spl) {
                sb.append(arrWords[index]).append(" ");
                index++;
            } else {
                list.add(sb.toString().trim());
                sb.setLength(0);
            }
        }
        if (sb.length() > 0) {
            list.add(sb.toString());
            sb.setLength(0);
        }
        return list;
    }
Спасибо)
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх