-4

リストにファイル名を入力しました。葯リストに検索結果を入力する必要があります。この検索結果は、次の指定でバイナリ検索によって実行する必要があります。キーワードはファイル名と一致するか、Substring(0、key.Length)である可能性があります。例:keyword ="car"検索結果="car.gif"、 "carffur.pdf"など。ただし、"mobilecar.jar"は除く

私の二分探索:

    class Search
{
    private const int KEY_NOT_FOUND = -1;

    public static int BinarySearch<T>(List<T> A, T key, IComparer<T> comparer, int imin, int imax)
    {
        // test if array is empty
        if (imax < imin)
            // set is empty, so return value showing not found
            return KEY_NOT_FOUND;
        else
        {
            // calculate midpoint to cut set in half
            int imid = imin + ((imax - imin) / 2);
            int compareResult = comparer.Compare(A[imid], key);
            // three-way comparison
            if (compareResult > 0)
                // key is in lower subset
                return BinarySearch<T>(A, key, comparer,imin, imid - 1);
            else if (compareResult < 0)
                // key is in upper subset
                return BinarySearch<T>(A, key, comparer, imid + 1, imax);
            else
                // key has been found
                return imid;
        }
    }
}

私の比較クラス:

    class SubStringComparison : IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (x.Length > y.Length && x.Substring(0, y.Length).Equals(y))
            return 0;

        return String.Compare(x, y, StringComparison.OrdinalIgnoreCase);
    }
}

利用方法:

private void backgroundWorkerSearch_DoWork(object sender, DoWorkEventArgs e)
    {
        SearchForFiles();
    }

    private void SearchForFiles()
    {
        List<string> files = listBoxFiles.Items.OfType<string>().ToList();
        searchResults = new List<string>();
        listBoxFiles.Dispatcher.Invoke(new Action(delegate()
            {
                while (true)
                {
                    int index = Search.BinarySearch<string>(files, textBoxFileToSearch.Text, new SubStringComparison(), 0, files.Count - 1);
                    if (index == -1)
                        break;
                    else
                        searchResults.Add(files[index]);
                }
            }));
    }
4

1 に答える 1

0

-1宿題のどの部分で問題がありますか?二分探索ですか?それはファイル名の選択ですか?期待どおりに機能していないのはBackgroundWorkerのものですか?

BackgroundWorkerに問題があるようですが、BackgroundWorkerスレッドのUIからファイルのリストを選択してから、メインスレッドで実行されるアクションを作成しているようです。これは非常に奇妙な方法です。

正しい方法は次のとおりです。

public void button1_Click(object sender)
{
    List<string> files = listBoxFiles.Items.OfType<string>().ToList();
    string key = textBoxFileToSearch.Text;
    backgroundWorkerSearch.RunWorkerAsync(new Tupple<List<string>,string>(files, key));
}

void backgroundWorkerSearch_DoWork(object sender, DoWorkEventArgs e)
{
     var state = e.Argument as Tupple<List<string>,string>;
     List<string> files = state.Item1;
     string key = state.Item2;
     // You can now access the needed data.
     List<string> searchResult = new List<string>();
     // ...
     e.Result = searchResult;
}

void backgroundWorkerSearch_RunWorkerCompleted(RunWorkerCompletedEventArgs e)
{
     List<string> searchResult = e.Result;
     // Show result in the UI thread.
} 
于 2013-03-16T07:36:10.733 に答える