2010-10-29 31 views
16

Trước khi tôi phát minh lại bánh xe (kém), tôi muốn biết nếu có một số mã Java hiện có để gói các dòng văn bản vào một chiều rộng tối đa nhất định. Lý tưởng nhất là nó sẽ:Mã Java để gói dòng văn bản vào chiều rộng dòng tối đa

  • tôn trọng linebreaks hiện
  • chia tay dòng vượt quá chiều dài tối đa trên ranh giới từ
  • lời chia tay có chiều dài vượt quá chiều rộng dòng tối đa bằng dấu gạch nối chèn

Chỉnh sửa: không có "pixel" ở đây, chỉ java.lang.String. "chiều rộng tối đa" đề cập đến số ký tự trên một dòng.

+2

Thar là Dragons :-) –

+1

Bạn có phải là một thuật toán hoàn hảo pixel hay một phép tính xấp xỉ sẽ thực hiện? – aioobe

Trả lời

0

gì bạn muốn làm sẽ chỉ làm việc nếu bạn hiển thị các kết quả với một phông chữ cố định chiều rộng. Nếu không, số lượng ký tự trong một dòng sẽ không giống nhau từ dòng này sang dòng khác. Nếu đó là tốt với bạn, tôi sẽ nói rằng của bạn là một trường hợp khá phổ biến (đặc biệt là xem xét hyphenation), vì vậy tôi nghi ngờ bạn sẽ tìm thấy giải pháp làm sẵn.

0

Nếu bạn đang cố gắng định dạng một số cách thức tài liệu, cũng có dòng lệnh rix cũ (hoặc dòng chảy) cũ. Bạn chỉ cần chèn các lệnh định dạng và để roff thực hiện việc nâng hạng nặng.

1
public static List<String> stringBreak(String string, int maxChar) { 

    List<String> subLines = new ArrayList<String>(); 

    int length = string.length(); 
    int start = 0; 
    int end = maxChar; 
    if (length > maxChar) { 

     int noOfLines = (length/maxChar) + 1; 

     int endOfStr[] = new int[noOfLines]; 

     for (int f = 0; f < noOfLines - 1; f++) { 

      int end1 = maxChar; 

      endOfStr[f] = end; 

      if (string.charAt(end - 1) != ' ') { 

       if (string.charAt(end - 2) == ' ') { 

        subLines.add(string.substring(start, end - 1)); 
        start = end - 1; 
        end = end - 1 + end1; 

       } else if (string.charAt(end - 2) != ' ' 
         && string.charAt(end) == ' ') { 

        subLines.add(string.substring(start, end)); 
        start = end; 
        end = end + end1; 

       } else if (string.charAt(end - 2) != ' ') { 

        subLines.add(string.substring(start, end) + "-"); 
        start = end; 
        end = end + end1; 

       } else if (string.charAt(end + 2) == ' ') { 
        System.out.println("m here ............"); 
        int lastSpaceIndex = string.substring(start, end) 
          .lastIndexOf(""); 
        subLines.add(string.substring(start, lastSpaceIndex)); 

        start = lastSpaceIndex; 
        end = lastSpaceIndex + end1; 
       } 

      } else { 

       subLines.add(string.substring(start, end)); 
       start = end; 
       end = end + end1; 
      } 

     } 

     subLines.add(string.substring(endOfStr[noOfLines - 2], length)); 

    } 

    return subLines; 
} 
+9

Não của tôi đã ném ra một IndexOutOfBoundsException trong khi đọc đoạn mã này. :( –

0

Dưới đây là quan điểm của tôi

private static final String linebreak = "\n"; // or "\r\n"; 

public static String wrap(String string, int lineLength) { 
    StringBuilder b = new StringBuilder(); 
    for (String line : string.split(Pattern.quote(linebreak))) { 
     b.append(wrapLine(line, lineLength)); 
    } 
    return b.toString(); 
} 

private static String wrapLine(String line, int lineLength) { 
    if (line.length() == 0) return linebreak; 
    if (line.length() <= lineLength) return line + linebreak; 
    String[] words = line.split(" "); 
    StringBuilder allLines = new StringBuilder(); 
    StringBuilder trimmedLine = new StringBuilder(); 
    for (String word : words) { 
     if (trimmedLine.length() + 1 + word.length() <= lineLength) { 
      trimmedLine.append(word).append(" "); 
     } else { 
      allLines.append(trimmedLine).append(linebreak); 
      trimmedLine = new StringBuilder(); 
      trimmedLine.append(word).append(" "); 
     } 
    } 
    if (trimmedLine.length() > 0) { 
     allLines.append(trimmedLine); 
    } 
    allLines.append(linebreak); 
    return allLines.toString(); 
} 

(Giải pháp này các chuyến đi hai không gian để một khoảng trống (do cùng lỗi mà @jett có với Apache commons WordUtils)).

Các vấn đề liên quan