Я хочу разделить строку после определенной длины, не вырезать слова, не равные String - PullRequest
4 голосов
/ 20 сентября 2019

Я хочу разделить строку, например «Только рупии двести сорок один и шестьдесят восемь», когда ее длина равна 35, я хочу разделить эту строку на 2. Я пытался этот код разделить строку.

String text = "Rupees Two Hundred Forty One and Sixty Eight only";
List<String> parts = new ArrayList<>();
int length = text.length();
for (int i = 0; i < length; i += 35) {
    parts.add(text.substring(i, Math.min(length, i + size)));

но вывод такой:

[Rupees Two Hundred Forty One and Si, xty Eight only]

Но я хочу разбить строку следующим образом.

[Rupees Two Hundred Forty One and, Sixty Eight only]

При разбиении строки слово отсечения отсутствует.Строка меняется каждый раз в зависимости от суммы счета.

Ответы [ 5 ]

2 голосов
/ 20 сентября 2019

Возможно, вы не сможете сделать это точно.Но используйте String.indexOf (), чтобы найти первый пробел, начинающийся с 35. Затем используйте метод подстроки для разделения строки.

      String text = "Rupees Two Hundred Forty One and Sixty Eight only";
      int i = text.indexOf(" ", 35);
      if (i < 0) {
         i = text.length();
      }
      String part1 = text.substring(0,i).trim();
      String part2 = text.substring(i).trim();

Вот альтернативный метод.Он не был полностью проверен для пограничных случаев.

      String[] words = text.split(" ");
      int k;
      part1 = words[0];
      for (k = 1; k < words.length; k++) {
         if (part1.length() >= 35 - words[k].length()) {
            break;
         }
         part1 += " " + words[k];
      }
      if (k < words.length) {
         part2 = words[k++];
         while (k < words.length) {
            part2 += " " + words[k++];
         }
      }
      System.out.println(part1);
      System.out.println(part2);

1 голос
/ 20 сентября 2019

Просто найдите предпочтительную позицию в позиции i+35.Следует учитывать, что должно происходить, когда такой позиции нет, т. Е. Слово превышает заданный размер.В следующем коде будет применяться ограничение размера, разрывая его в середине слова, если не найдено подходящей позиции:

List<String> parts = new ArrayList<>();
int size = 35, length = text.length();
for(int i = 0, end, goodPos; i < length; i = end) {
    end = Math.min(length, i + size);
    goodPos = text.lastIndexOf(' ', end);
    if(goodPos <= i) goodPos = end; else end = goodPos + 1;
    parts.add(text.substring(i, goodPos));
}

Если разрыв произошел с пробелом, пробел будет удален из результата.строки.

0 голосов
/ 20 сентября 2019

Я думаю, вы можете использовать цикл while для подсчета слов, содержащих последний пробел:

public static List<String> split(String str, int length) {
    List<String> res = new ArrayList<>();
    int prvSpace = 0;
    int from = 0;

    while (prvSpace < str.length()) {
        int pos = str.indexOf(' ', prvSpace + 1);

        if (pos == -1) {
            res.add(str.substring(from));
            prvSpace = str.length();
        } else if (pos - from < length)
            prvSpace = pos;
        else {
            res.add(str.substring(from, prvSpace));
            from = prvSpace + 1;
        }
    }

    return res;
}

Демонстрация:

in: "RupeesTwoHundredFortyOneandSixtyEightonly"
out: ["RupeesTwoHundredFortyOneandSixtyEightonly"]

in: "Rupees Two Hundred Forty One and Sixty Eight only"
out: ["Rupees Two Hundred Forty One and", "Sixty Eight only"]
0 голосов
/ 20 сентября 2019

Я бы начал строить строку с нуля, используя StringBuilders.Пример с некоторыми комментариями внутри:

    String text = "Rupees Two Hundred Forty One and Sixty Eight only For seven thousand chickens";
    String split[] = text.split(" "); // Split by space
    // One SB for each sentence
    StringBuilder sentence = new StringBuilder();
    // One SB for the total String
    StringBuilder total = new StringBuilder();
    for (int i = 0; i < split.length; i++) {
        String word = split[i];
        // Check if that words fits to sentence
        if (sentence.length() + word.length() <= 35) {
            sentence.append(word);
            sentence.append(" ");
        } else {
            total.append(sentence.toString().trim());
            total.append(", ");
            // Flush sentence to total and start next sentence
            sentence = new StringBuilder();
            sentence.append(word);
            sentence.append(" ");
        }
    }
    //Add any leftover
    if (sentence.length() > 0)
        total.append(sentence.toString().trim());
    System.out.println(total.toString());

Который выводит:

Рупии двести сорок один и, только шестьдесят восемь Для семи тысяч цыплят

0 голосов
/ 20 сентября 2019

Вы можете найти индекс «и» и подстроку строки от 0 до индекса «и».

 int i = text.indexOf("and") + 3;
 String part1 = text.substring(0,i);
 String part2 = text.substring(i).trim();
...