2012-06-28 3 views
3

У меня есть семь строк в программе с именем string1 через строку7.разделительная строка в java в куски фиксированной длины

Размер каждой строки будет 30 символов.

Я получу строку ввода неизвестной длины.

Мне нужно разбить эту входную строку в 30 строках символов, а затем установить первую подстроку в строку1, вторую в строке2 и так далее до тех пор, пока это возможно. Если строка ввода больше 210 символов, то оставшаяся строка в конце будет проигнорирована.

Как обрабатывать случай, когда входная строка имеет размер меньше 210 символов.

См., Например, 145, в этом случае строка1 через строку4 будет заполнена, а строка5 будет состоять из оставшихся 15 символов.

Как с этим справиться?

Я могу сделать это, читая char символом char и помещая сначала 30 символов и string1, затем в строку2 и т. Д., Пока не будет поглощен весь символ.

Но есть ли лучший способ сделать это?

ответ

4

Поскольку ваши строки не находятся в массиве или списке, вам необходимо назначить их явно.

Matcher m = Pattern.compile(".{1,30}").matcher(s); 
    String s1 = m.find() ? s.substring(m.start(), m.end()) : ""; 
    String s2 = m.find() ? s.substring(m.start(), m.end()) : ""; 
    String s3 = m.find() ? s.substring(m.start(), m.end()) : ""; 
    String s4 = m.find() ? s.substring(m.start(), m.end()) : ""; 
    String s5 = m.find() ? s.substring(m.start(), m.end()) : ""; 
    String s6 = m.find() ? s.substring(m.start(), m.end()) : ""; 
    String s7 = m.find() ? s.substring(m.start(), m.end()) : ""; 
+0

Элегантный! Большое спасибо. – Nik

9

Если вы можете использовать сторонние библиотеки, с Guava это just

Iterable<String> chunks = Splitter.fixedLength(30).split(string); 

Это может быть преобразован в List<String> с, например, Lists.newArrayList.

(Раскрытие информации:. Я способствовать гуавы)

+0

Нет. Я не могу использовать Guava. Кроме того, Iterable может иметь любой размер от 1 до 7. Как установить string1 через строку7 из Iterable. Обратите внимание, что строка1 через строку7 не зависит друг от друга. – Nik

+0

Если вам нужно получить их в семь разных переменных, у вас нет абсолютно никакого выбора, кроме как сделать это вручную. Если бы вы могли использовать массив, это дало бы вам больше гибкости, но если у вас семь разных переменных, нет простого способа сделать это. –

+0

Кажется, это возможно. Пожалуйста, см. Ответ Майкла. – Nik

2

Это то, что должно работать:

String str = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"; 
     if (str.length() > 210) 
     { 
      str = str.substring(0, 209); 
     } 
     String newStr = str.replaceAll("(.{30})", "$1|"); 
     System.out.println(newStr); 
     String[] newStrings = newStr.split("\\|"); 

Что она делает то, что он принимает заданную строку и через каждые 30 символов, она бросает в Сепаратор. В этом случае я предполагаю, что у вас есть представление о том, что вводит пользователь, и что не так, что вы можете бросить в seperator (или группу seperators), которые пользователь не будет вводить. Как только я это сделаю, я разделил строку, используя только что добавленный сепаратор.

1

Это может вам помочь.

public static void main(String args[]) throws IOException { 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      String st = br.readLine(); 
      int len = st.length(); 
      String[] str = new String[7]; 
      len=len/30; 
      int i=0; 
      for(; i<7 && i<len; i++ ){ 
       str[i] = st.substring(30*i, 30*(i+1)); 
       System.out.println(str[i]); 
      } 
      if(i!=7){ 
       str[i] = st.substring(30*i, st.length()); 
       System.out.println(str[i]); 
       } 

     } 
0

Это то, что я и сделал. Кажется, работает. Прошу прокомментировать, если я ошибаюсь где-либо:

package com.mypackage; 

import java.util.ArrayList; 
import java.util.List; 


public class TestClass { 

public static List<String> splitEqually(final String text, final int size) { 

    List<String> ret = new ArrayList<String>((text.length() + size - 1)/size); 
    for (int start = 0; start < text.length(); start += size) { 

     if (start + size > 0) { 

      String temp = text.substring(start, Math.min(text.length(), start + size)); 
      int length = temp.length(); 

      for (int i = 0; i < (size - length); i++) { 
       temp = temp + " "; 
      } 

      ret.add(temp); 

     } else { 
      ret.add(text.substring(start, Math.min(text.length(), start + size))); 
     } 


    } 
    return ret; 
} 

public static void main(final String args[]) { 

    String input = "hello wo"; 

    String str1, str2, str3, str4, str5; 

    List<String> result = TestClass.splitEqually(input, 3); 

    try { 
     str1 = result.get(0); 
     System.out.println("1: " + result.get(0)); 

     str2 = result.get(1); 
     System.out.println("2: " + result.get(1)); 

     str3 = result.get(2); 
     System.out.println("3: " + result.get(2)); 

     str4 = result.get(3); 
     System.out.println("4: " + result.get(3)); 

     str5 = result.get(4); 
     System.out.println("5: " + result.get(4)); 

    } catch (IndexOutOfBoundsException e) { 
    } 

} 
} 
0
import java.util.ArrayList; 


public class Test { 

public static void main(String[] args) { 

    // your input 
    String input = ""; 

    // strings 1-7 as array list 
    ArrayList<String> results = new ArrayList<String>(); 

    int length; 

    if(input.length() > 210) { 

     length = 210; 

    } else { 

     length = input.length(); 

    } 

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

     if((length - (i + 30)) > 0) { 

      results.add(input.substring(i, i + 30)); 

     } else { 

      results.add(input.substring(i, length)); 

     } 

    } 

    for(int a = 0; a < results.size(); a++) { 

     System.out.println("size: " + results.get(a).length() + " content: " + results.get(a)); 

    } 

    } 

    } 
2

Как насчет использования массива символов для разделения строки, создать метод общего использования, принимающего размер порции и максимального размер, чтобы рассмотреть, и возвращающий массив строк?

public class SplitStringIntoFixedSizeChunks { 

    public static String[] Split(String text, int chunkSize, int maxLength) { 
     char[] data = text.toCharArray();  
     int len = Math.min(data.length,maxLength); 
     String[] result = new String[(len+chunkSize-1)/chunkSize]; 
     int linha = 0; 
     for (int i=0; i < len; i+=chunkSize) { 
      result[linha] = new String(data, i, Math.min(chunkSize,len-i)); 
      linha++; 
     } 
     return result; 
    } 

    public static void main(String[] args) { 
     String x = "flskdafsld~fdsakçkçfsda sfdaldsak~çfdskkfadsçlkçfldskçlflçfdskçldksçlkfdslçakafdslçdsklçfdskçlafdskçkdfsçlkfds~çlkfasdçlçfdls~kçlf~dksçlsakdçlkfç"; 
     System.out.println("x length: "+x.length()); 
     String[] lines = Split(x, 30, 210); 
     for (int i=0; i < lines.length; i++) { 
      System.out.println("lines["+i+"]: (len: "+lines[i].length()+") : "+lines[i]); 
     } 
    } 
} 

В этом примере результаты:

x length: 145 
lines[0]: (len: 30) : flskdafsld~fdsakçkçfsda sfdald 
lines[1]: (len: 30) : sak~çfdskkfadsçlkçfldskçlflçfd 
lines[2]: (len: 30) : skçldksçlkfdslçakafdslçdsklçfd 
lines[3]: (len: 30) : skçlafdskçkdfsçlkfds~çlkfasdçl 
lines[4]: (len: 25) : çfdls~kçlf~dksçlsakdçlkfç 
1
private static Collection<String> splitStringBySize(String str, int size) { 
    ArrayList<String> split = new ArrayList<>(); 
    for (int i = 0; i <= str.length()/size; i++) { 
     split.add(str.substring(i * size, Math.min((i + 1) * size, str.length()))); 
    } 
    return split; 
} 
0

Я столкнулся с проблемой с конкретным применением этой методики. Пользователь копировал/вставлял содержимое M $ Word в поле HTML, которое в конечном итоге было подхвачено этой техникой для разделения на несколько полей базы данных.

Методика была нарушена в отношении использования слов M $ для возврата каретки и других символов ASCII. REGEX отделил бы каждый возврат каретки вместо указанного количества символов. Чтобы исправить эту проблему, я изменил код Майкла Бестека на следующее:

Matcher m = Pattern.compile(".{1,30}", Pattern.DOTALL).matcher(s); 
String s1 = m.find() ? s.substring(m.start(), m.end()) : ""; 
String s2 = m.find() ? s.substring(m.start(), m.end()) : ""; 
String s3 = m.find() ? s.substring(m.start(), m.end()) : ""; 
String s4 = m.find() ? s.substring(m.start(), m.end()) : ""; 
String s5 = m.find() ? s.substring(m.start(), m.end()) : ""; 
String s6 = m.find() ? s.substring(m.start(), m.end()) : ""; 
String s7 = m.find() ? s.substring(m.start(), m.end()) : ""; 

Это правильно отвечает за символы ASCII.

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