[英]How can I find the “least common part” among the paths on the same logical drive?
我的程序有幾個值得關注的路徑,例如
C:\\ XML
C:\\ MyProg \\ Raw
C:\\ MyProg \\ Subset \\ MTSAT
C:\\ MyProg \\ Subset \\ GOESW
D:\\ Dataset \\ Composite
D:\\ Dataset \\ Global
E:\\ Dataset \\ Mosaic
我想向我的CFolderWatch類實例添加4條路徑,即C:\\ XML,C:\\ MyProg,D:\\ Dataset和E:\\ Dataset,以用於文件夾監視上述所有7條路徑的insetad,只要其“包含子目錄”開關設置為TRUE。 假設所有被監視的路徑都已添加到向量容器中。
因此,我的問題是:如何在同一邏輯驅動器的路徑中找到“最少的部分”? 先感謝您!
我的問題的詳細說明:1.我有一些用戶定義的目錄。 2.我要注意這些目錄。 3.在觀看之前,我想做一些准備工作,例如,在同一邏輯驅動器上的路徑中找到公用部分,以避免可能在我的觀看班級中添加太多路徑。 例如,如果邏輯驅動器C:上有3條路徑,如下所示:C:\\ test \\ Data \\ R1,C:\\ test \\ Data \\ R2和C:\\ test \\ Data \\ R3,則公共路徑為“ C:\\ test \\ Data”。 因此,我們應該將“ C:\\ test \\ Data”添加到監視模塊,而不是三個路徑。 我的意思是這里的通用路徑是至少具有一級目錄。 如果一個路徑與其他路徑沒有公共路徑,則僅返回不變。 4.首先,算法應處理不同的邏輯驅動器。 也就是說,必須根據各自的驅動器字母對所有路徑進行分類。 然后,在同一邏輯驅動器號上的傳遞路徑中找到公用路徑。
兩步算法:
通過計算每個目錄與其下一個同級共有多少個前綴字符並保持最小值,可以輕松獲得每個分區的最長前綴。 例如,使用不匹配 。
正如JB所說,我認為這是一個兩步解決方案,並且我已經在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);*/
}
}
}
}
這是一個非常簡單的程序,它假定您在字符串中包含路徑並檢查重復項。 如果路徑數量較大,則必須采用效率更高的解決方案。
沒有算法; 您使用的邏輯不一致。
只考慮一套
至少有4種不同的解決方案:
您無法解釋為什么2.是正確的解決方案。 這是可能編寫發現溶液N-1給出的溶液N作為輸入的算法,這樣就可以從(1)在三個步驟中的輸入端(4)得到。 但是我們不明白為什么要停在(2)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.