Как найти «наименьшую часть» среди путей на одном логическом диске? - PullRequest
0 голосов
/ 22 сентября 2011

Моя программа имеет несколько путей для просмотра, таких какC: \ XMLC: \ MyProg \ RawC: \ MyProg \ Подмножество \ МТСАТC: \ MyProg \ Подмножество \ GOESWD: \ Dataset \ КомпозитныйD: \ Dataset \ GlobalE: \ Dataset \ Мозаика

Я хочу добавить 4 пути, а именно C: \ XML, C: \ MyProg, D: \ Dataset и E: \ Dataset, в мой экземпляр класса CFolderWatch с целью наблюдения за папками из всех 7 приведенных выше.пути до тех пор, пока для его переключателя «Включить подкаталог» задано значение ИСТИНА.Предположим, что все отслеживаемые пути были добавлены в векторный контейнер.

Поэтому мой вопрос таков: как мне найти «наименьшую часть» среди путей на одном логическом диске?Заранее спасибо!

Подробное объяснение моего вопроса: 1. Я получил несколько пользовательских каталогов.2. Я хочу, чтобы за этими каталогами следили.3. Перед просмотром я хочу сделать некоторую подготовительную работу, например, найти общую часть среди путей на одном логическом диске, чтобы избежать добавления такого количества путей в мой класс просмотра.Например, если на логическом диске C: есть 3 пути, как указано ниже: C: \ test \ Data \ R1, C: \ test \ Data \ R2 и C: \ test \ Data \ R3, общий путь будет "C: \ Test \ Data».Итак, мы должны добавить «C: \ test \ Data» в модуль наблюдения, а не три пути.Я имею в виду общий путь здесь, что он имеет по крайней мере один уровень каталога.Если один путь не имеет общего пути с другими, просто возвращается без изменений.4. Во-первых, алгоритм должен обрабатывать различные логические диски.То есть все пути должны быть классифицированы на основе их соответствующей буквы диска.Затем найдите общий путь среди переданных путей в той же букве логического диска.

Ответы [ 3 ]

0 голосов
/ 22 сентября 2011

Как сказал 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);*/
        }               
    }
}
}

Это очень простая программа, которая предполагает, что у вас есть пути в строке, и проверяет наличие дубликатов. Если для большого числа путей вы должны принять гораздо более эффективное решение.

0 голосов
/ 22 сентября 2011

Там нет алгоритма;вы используете противоречивую логику.

Рассмотрим только набор

  1. C: \ XML
  2. C: \ MyProg \ Raw
  3. C:\ MyProg \ Subset \ MTSAT
  4. C: \ MyProg \ Subset \ GOESW

Существует как минимум 4 различных решения:

  1. C: \
  2. C: \ XML и C: \ MyProg \
  3. C: \ XML, C: \ MyProg \ Raw и C: \ MyProg \ Subset
  4. C: \ XML,C: \ MyProg \ Raw, C: \ MyProg \ Subset \ MTSAT и C: \ MyProg \ Subset \ GOESW

Вы не можете объяснить, почему 2. является правильным решением. можно написать алгоритм, который находит решение N-1 для данного решения N в качестве входных данных, так что вы можете перейти от входа (4) к (1) в три этапа.Но мы не понимаем, почему мы должны остановиться на (2).

0 голосов
/ 22 сентября 2011

Двухшаговый алгоритм:

  1. Разделите ваши каталоги по букве диска и первому уровню каталога.
  2. Для каждого раздела сохраните самый длинный префикс.

Самый длинный префикс на раздел можно легко получить, посчитав, сколько символов префикса имеет каждый каталог вместе со своим последующим братом и сохранив минимум Используя несоответствие , например.

...