0

ベクトルのベクトルがあります(指定された長さではありません)。これで、検索する文字列と、フォローアップとプレアップを見つけたいと思います。私はこれをこれまで試しました。mainstr は、文字列に変換された私のベクトルです。

  String mainstr = "[[data link control], [communication, []], [computer, [applications     of computer, number of computer]], [world wide web], [lesson, [covered in lesson]], [access to remote], [marketing and sale], [electronic fund transfer], [network, [network of network, wide area network, communication network, computer network, [area network, [local area network, metropolitan area network]]]]]";

String search = "communication network";

if (mainstr.contains(search)) {
            if (mainstr.charAt(mainstr.indexOf(search) + search.length()) == ']' && mainstr.charAt(mainstr.indexOf(search) - 2) == '[') {
                System.out.println("single term");
            } else {
                int indexSearch = str.indexOf(search) + search.length();
                String followers = str.substring(indexSearch, str.length());
                if (!followers.equals("")) {
                    System.out.println("No FOLLOWERS");
                } else {
                    System.out.println("followers = " + followers.substring(0, followers.indexOf("]")));
                }
                if (mainstr.charAt(mainstr.indexOf(search) - 4) == ']') {
                    System.out.println("No pre found");
                } else {
                    System.out.println("preups are present");
                    String preup = mainstr.split(search)[0].substring(0, mainstr.split(search)[0].length() - 1);
                    String finalPreup = preup.substring(preup.lastIndexOf("[") + 1, preup.lastIndexOf(","));
                    System.out.println("final : " + finalPreup);
                }
                System.out.println("found...");
            }
        } else {
            System.out.println("Not Found");
        }

この場合、出力は次のようになります-

No FOLLOWERS
preups are present
final : network of network, wide area network
found...

このベクトルを文字列に変換してから検索を実行しましたが、一部の文字列に対して正しい出力が得られ、この特定のケースでは目的の出力が得られません。ベクトルに存在する任意の文字列に対して機能する一般化されたコードに興味がありました。前もって感謝します。

更新::

実際には、これはベクトルのベクトルに入れた私のツリー構造です。

-data link control
-communication
-computer
    - applications of computer
    -number of computer
-world wide web
-lesson
    -covered in lesson
-access to remote
-marketing and sale
-electronic fund transfer
-network
    -network of network
    -wide area network
    -communication network
    -computer network
    -area network
           -local area network
           -metropolitan area network

だから私は検索がツリーごとになることを望みます。たとえば、 search=="広域ネットワーク" の場合、そのフォロワー=フォロワーなし は、下に階層がないため、内部に要素がないことを意味します。およびその Pre up=network は、ヘッド ノード ネットワークのサブ要素であるためです。

前もって感謝します。

4

1 に答える 1

0

[最後のインデックスではなく、最後から2番目のインデックスを見つける必要があるため、コードは必要なものを出力しないと思います。そして、一度修正すると、あなたのコードは子を持つノード間をジャンプできないと思います。これには、ブラケット カウンターを使用した while ループをお勧めします。

以下は私の試みです。これは単なる基本的なプログラムです。境界チェックなどはありませんが、何をすべきかについてのアイデアが得られるはずです。

  String mainstr = "[[data link control], [communication, []], [computer, [applications     of computer, number of computer]], [world wide web], [lesson, [covered in lesson]], [access to remote], [marketing and sale], [electronic fund transfer], [network, [network of network, wide area network, communication network, computer network, [area network, [local area network, metropolitan area network]]]]]";
  String search = "communication network";
  int start = mainstr.indexOf(search);
  if (start != -1)
  {
     int end = start + search.length();
     int count = 0;
     int pos = end;
     if (mainstr.charAt(end+2) == '[')
     {
        while (count != -1)
           if (mainstr.charAt(++pos) == ']')
              count--;
           else if (mainstr.charAt(++pos) == '[')
              count++;
        System.out.println("Ancestors = " + mainstr.substring(end+2, pos-1));
     }
     count = 0;
     pos = start;
     int lastComma = -1;
     while (count != 2)
        switch (mainstr.charAt(--pos))
        {
           case ']': count--; break;
           case '[': count++; break;
           case ',': lastComma = pos;
        }
     System.out.println("Parent = " + mainstr.substring(pos+1, lastComma));
  }

文字列の前にある別のノードの部分文字列であるノードを探している場合、これは少し問題です。

このため、正規表現がうまく機能すると思いました。

交換

int start = mainstr.indexOf(search);
if (start != -1)
{

Pattern p = Pattern.compile("(?:^|, |\\[)(" + search + ")(?:]|, |$)");
Matcher m = p.matcher(mainstr);
if (m.find())
{
   int start = m.start(1);

テスト

Java 正規表現リファレンス.

于 2013-07-11T14:15:27.257 に答える