3

私は無料のマーカーとJavaを使用しています。結果をtxtファイルに出力する必要があります。3列を印刷する必要があるとしましょう

`A     B      C`

同様のパターンで。文字列としての3つの属性すべて。条件は、Aを参照する文字列の長さが3を超える場合、次の行に出力する必要があるということです。つまり、長さが8の場合、最初の3文字が最初の行に、4〜6文字が2番目に、残りの2文字が3番目になります。その後、Bを印刷する必要がある場合は、最初の行に戻る必要がありますが、Aの現在の位置は3行目になります。

どうすればこれを行うことができますか?

Hi,                          (required cursor position to print for B).
Hel
lo(current cursor position)
4

3 に答える 3

1

文字列用のFreeMarker組み込み関数を調べましたが、これを直接解決する関数はないと思いますが、できることは次のとおりです。

テンプレートに渡すJavaの属性を持つ3つのリストがあると仮定します。テンプレートで、残りの文字を格納するバッファリストとして使用される別の3つのリストを作成します。

関数文字列関数 substring(0, 3)を使用して、列Aに直接出力できる属性文字列の量を計算します。文字が残っている場合は、それらを最初のバッファリストに追加します。

次に、列BとCに対して同じ手順を繰り返します。その後、列Aが再び回転します(今回は2行目)。今回は、Javaから渡されたリストではなく、バッファリストを調べます。前の属性の文字がまだ残っているのでしょうか、それとも渡されたリストを使用できるのでしょうか。

残りの文字がある場合は、再度適用substring(0, 3)し、最初のバッファーリストの先頭に残っている可能性のある文字をもう一度押します。などなど...

これは退屈なことですが、私が考えることができる唯一の解決策です。

于 2012-08-07T18:02:06.847 に答える
0

純粋にFreeMarkerで実装するのはちょっと厄介ですが、それを実行するのに十分な完全な言語です。これがにあるとしましょうmyutils.ftl

<#function safeSubstring s start end>
  <#if s?length < start><#return ''></#if>
  <#if s?length < end>
    <#return s?substring(start)>
  <#else>
    <#return s?substring(start, end)>
  </#if>
</#function>

<#macro printColumns cols>
    <#list 0..999999 as i>
      <#local start = i * 3>
      <#local printedSomething = false>
      <#list cols as col>
        <#if start < col?length>
          <#local printedSomething = true>
          <#lt><#list cols as col>${safeSubstring(col, start, start + 3)?right_pad(8)}</#list>
          <#break>
        </#if>
      </#list>
      <#if !printedSomething><#break></#if>
    </#list>
</#macro>

そして、あなたは次のことができます:

<#import "myutils.ftl" as u>
...
<@u.printColumns ['Helo', "How are you?", "Wassup"] />

より高いパフォーマンスが必要な場合は、これをJavaでTemplateDirectiveModel(またはTemplateMethodModelEx)として実装してから、にmyutils.ftl変更することを検討して<#assign printColumns = "com.whatever.PrintColumnsDirective"?new()>ください。

于 2012-08-08T06:40:55.867 に答える
0

フリーマーカーがわかりません。文字列操作を使用する方法の1つを次に示します。

  1. 取るStringBuilder
  2. A、B、またはCには文字が残っていますが
  3. Aの場合、最大3文字の抽出を追加します
  4. 8文字まで空白を追加します
  5. Bの場合、最大3文字の抽出を追加します
  6. 8文字まで空白を追加します
  7. Cの場合、最大3文字の抽出を追加します
  8. 8文字まで空白を追加します
  9. 改行を追加

コード例を次に示します。最適化されていない可能性がありますが、機能します。

public static void main(String[] args) {
  System.out.println(formatOutput("Hello", "How are you?", "Wassup"));
}

public static String formatOutput(String textA, String textB, String textC) {
    StringBuilder output = new StringBuilder("");

    int beginIndex = 0, endIndex = 3;
    String snippet;
    while (textA.length() > 0 || textB.length() > 0 || textC.length() > 0) {
        if (textA.length() > endIndex) {
            snippet = textA.substring(beginIndex, endIndex);
            textA = textA.substring(endIndex);
        } else {
            snippet = textA.substring(beginIndex);
            textA = "";
        }
        output.append(snippet);
        for (int i = snippet.length(); i <= 8; i++)
            output.append(" ");
        ;

        if (textB.length() > endIndex) {
            snippet = textB.substring(beginIndex, endIndex);
            textB = textB.substring(endIndex);
        } else {
            snippet = textB.substring(beginIndex);
            textB = "";
        }
        output.append(snippet);
        for (int i = snippet.length(); i <= 8; i++)
            output.append(" ");


        if (textC.length() > endIndex) {
            snippet = textC.substring(beginIndex, endIndex);
            textC = textC.substring(endIndex);
        } else {
            snippet = textC.substring(beginIndex);
            textC = "";
        }
        output.append(snippet);
        for (int i = snippet.length(); i <= 3; i++)
            output.append(" ");
        output.append("\n");    
    }
    return output.toString();
}

出力:

Hel      How      Was 
lo        ar      sup 
         e y          
         ou?          
于 2012-08-07T18:11:01.087 に答える