0


私のプログラムには、 C:\XML
C:\MyProg\Raw
C:\MyProg\Subset\MTSAT
C:\MyProg\Subset\GOESW
D:\Dataset\Composite
D:\Dataset\Global
Eなど、監視するパスがいくつかあります。 :\データセット\モザイク

C:\XML、C:\MyProg、D:\Dataset、E:\Dataset という 4 つのパスを CFolderWatch クラス インスタンスに追加して、上記の 7 つのパスすべての insetad を監視するフォルダーを目的として、その「サブディレクトリを含める」スイッチがTRUEに設定されています。監視されているすべてのパスがベクター コンテナーに追加されているとします。

したがって、私の質問は次のとおりです。同じ論理ドライブ上のパスの中で「最も一般的でない部分」を見つけるにはどうすればよいですか? 前もって感謝します!

私の質問に対する詳細な説明: 1. ユーザー定義のディレクトリをいくつか取得しました。2. これらのディレクトリを監視したい。3. 監視する前に、いくつかの準備作業を行いたいと思います。たとえば、同じ論理ドライブ上のパス間で共通部分を見つけて、監視クラスに非常に多くのパスを追加しないようにします。たとえば、論理ドライブ C: に C:\test\Data\R1、C:\test\Data\R2、C:\test\Data\R3 の 3 つのパスがある場合、共通のパスは「 C:\テスト\データ". したがって、3 つのパスではなく、「C:\test\Data」を監視モジュールに追加する必要があります。ここで共通パスとは、少なくとも 1 レベルのディレクトリがあることを意味します。1 つのパスが他のパスと共通のパスを持たない場合は、そのまま戻ります。4. まず最初に、アルゴリズムは異なる論理ドライブを処理する必要があります。つまり、すべてのパスは、それぞれのドライブ文字に基づいて分類する必要があります。次に、同じ論理ドライブ文字で渡されたパスの中で共通のパスを見つけます。

4

3 に答える 3

0

JB が言ったように、これは 2 段階の解決策だと思います。ここでは、C# でいくつかの基本的なコーディングを試しました。Javaでそれが必要な場合は、それを使用する方法を知っている必要があると思います:)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace So_Try1
{
      class Program
{
    public static int nthOccurrence(String str, char c, int n)
    {
        int pos = str.IndexOf(c, 0);
        while (n-- > 0 && pos != -1)
            pos = str.IndexOf(c, pos + 1);
        return pos;
    }

    static void Main(string[] args)
    {
        List<String> pathString = new List<string>();
        pathString.Add("C:\\XML");
    pathString.Add("C:\\MyProg\\Raw");
    pathString.Add("C:\\MyProg\\Subset\\MTSAT");
    pathString.Add("C:\\MyProg\\Subset\\GOESW");
        pathString.Add("D:\\Folder2\\Mosaic");
        pathString.Add("D:\\Folder2\\Mosaic\\SubFolder");
        pathString.Add("D:\\Dataset\\Composite");
        pathString.Add("D:\\Dataset\\Global");
        pathString.Add("F:\\Folder1\\Mosaic");
        pathString.Add("H:\\Folder2\\Mosaic");
        pathString.Add("D:\\Folder2\\Mosaic");
        pathString.Add("D:\\Folder2\\Mosaic\\SubFolder");
        pathString.Add("E:\\Dataset\\Mosaic"); 
        Dictionary<String, int> PathDict = new Dictionary<string,int>();

        foreach (String str in pathString)
        {
            int count = 0;
            foreach (char c in str)
                if (c == '\\') count++;
            while (count > 0)
            {
                int index = nthOccurrence(str, '\\', count);
                String tempPath;
                if (index < 0)
                {
                    //Console.WriteLine(str);
                    tempPath = str;
                }
                else
                {
                    //Console.WriteLine(str.Substring(0,index));
                    tempPath = str.Substring(0, index);
                }

                if (PathDict.ContainsKey(tempPath))
                {
                    PathDict[tempPath]++;
                }
                else
                {
                    foreach (var keys in PathDict.Keys)
                    {
                        if (tempPath.IndexOf(keys) > 0)
                        {
                            PathDict[keys]++;
                        }
                    }
                    PathDict.Add(tempPath, 1);
                }
                count--;
            }
        }
        foreach(var keyValue in PathDict){
            if(keyValue.Value > 1)
                Console.WriteLine(keyValue.Key);
            /*Console.WriteLine(keyValue.Key + " - " + keyValue.Value);*/
        }               
    }
}
}

これは、文字列にパスがあり、重複をチェックしていると仮定する非常に単純なプログラムです。パスの数が多い場合は、より効率的なソリューションを採用する必要があります。

于 2011-09-22T15:09:55.680 に答える
0

2 段階のアルゴリズム:

  1. ドライブ文字と最初のディレクトリ レベルでディレクトリを分割します。
  2. パーティションごとに、最長のプレフィックスを保持します。

パーティションごとの最長プレフィックスは、各ディレクトリが次の兄弟と共通するプレフィックス文字の数を数え、最小値を維持することで簡単に取得できます。たとえば、ミスマッチを使用します。

于 2011-09-22T14:52:00.907 に答える