5

私が現在取り組んでいるプロジェクトでは、オブジェクトの配列が与えられ、それぞれに「コンテンツ」プロパティと「レベル」プロパティが含まれています。このリストを HTML の箇条書きリストに変換する必要があります。たとえば、次の入力が与えられたとします (わかりやすくするために JSON で示しています)。

[ {content: "Hey", level: "1"},
  {content: "I just met you", level: "2"},
  {content: "and this is crazy", level: "2"},
  {content: "but here's my number", level: "1"},
  {content: "call me, maybe", level: "3"} ]

次の XHTML に変換する必要があります。

<ul>
  <li>Hey</li>
  <li>
    <ul>
      <li>I just met you</li>
      <li>and this is crazy</li>          
    </ul>
  </li>
  <li>but here's my number</li>
  <li>
    <ul>
      <li>
        <ul>
          <li>call me, maybe</li>      
        </ul>
      </li>
    </ul>
  </li>
</ul>

最終製品は次のようになります。

  • おい
    • 私はちょうどあなたに会った
    • これはクレイジーです
  • しかし、これが私の番号です
    • 多分私に電話してください ( <- 1 レベル深い- 私は SO でこれを行うことができないと思います)

ちょっと変わったパズル。最も効率的/実装が簡単なアルゴリズム/アプローチに関する提案はありますか? 私はこれを C# で実装していますが、別の言語での例/アイデアは大歓迎です。

4

1 に答える 1

2

ここでの考え方は、レベルが前のレベル以上である限りネストする必要があり、それよりも小さい場合は閉じる必要があるということです。

public string BuildLists(List<KeyValuePair<string, int>> pairs)
{
    int CurrentLevel = 1;
    StringBuilder s = new StringBuilder();

    s.Append("<ul>");

    foreach (KeyValuePair<string, int> pair in pairs)
    {
        if(pair.Value > CurrentLevel)
        {
            //Nest more
            for(int i = 0; i < pair.Value - CurrentLevel; i++)
            {
                s.Append("<li><ul>");
            }
        }
        else if(pair.Value < CurrentLevel)
        {
            //Close Tags
            for(int i = 0; i < CurrentLevel - pair.Value; i++)
            {
                s.Append("</ul></li>");
            }
        }

        s.Append("<li>" + pair.Key + "</li>");

        CurrentLevel = pair.Value
    }

    //Close everything.
    for(int i = 0; i < CurrentLevel - 1; i++)
    {
        s.Append("</ul></li>");
    }

    s.Append("</ul>");
    return s.ToString();
}
于 2012-08-16T18:12:29.490 に答える