2017-04-25 9 views
-1

私は現在、ファイルを読み込んでバブルソートを使ってソートするプログラムを持っています。しかし、私は値のいずれかのファイルを検索できるようにする関数を実装する必要があります。私が使用したいアルゴリズムはバイナリサーチですが、これを実装する方法はわかりません。バイナリ検索をプログラムに適用する

入力する値を検索するファイルを選択できるようにするにはどうすればよいですか?

コードは(それらをソートして必要なんヘルプ)ファイルを読み込むと、ソートすることができるようにするために使用されていない:

var fileData = GetFileData(@"Data1/Day_1.txt", @"Data1/Depth_1.txt", 
    @"Data1/IRIS_ID_1.txt", @"Data1/Latitude_1.txt", @"Data1/Longitude_1.txt", 
    @"Data1/Magnitude_1.txt", @"Data1/Month_1.txt", @"Data1/Region_1.txt", 
    @"Data1/Time_1.txt", @"Data1/Timestamp_1.txt", @"Data1/Year_1.txt"); 

一部の上にあるMainメソッドから

public class FileData 
{ 
    public int File1Value { get; set; } 
    public decimal File2Value { get; set; } 
    public int File3Value { get; set; } 
    public decimal File4Value { get; set; } 
    public decimal File5Value { get; set; } 
    public decimal File6Value { get; set; } 
    public string File7Value { get; set; } 
    public string File8Value { get; set; } 
    public float File9Value { get; set; } 
    public int File10Value { get; set; } 
    public int File11Value { get; set; } 

    public override string ToString() 
    { 
     return String.Format($"{File1Value}|{File2Value}|{File3Value}|{File4Value}|{File5Value}|{File6Value}|{File7Value}|{File8Value}|{File9Value}|{File10Value}|{File11Value}"); 
    } 
} 

public static FileData[] GetFileData(string firstFilePath, string secondFilePath, 
    string thirdFilePath, string fourthFilePath, string fifthFilePath, 
    string sixthFilePath, string seventhFilePath, string eigthFilePath, 
    string ninthFilePath, string tenthFilePath, string eleventhFilePath) 
{ 

    int intHolder = 0; 
    decimal decHolder = 0; 
    float time = 0; 

    // Get a list of ints from the first file 
    var fileOneValues = File 
     .ReadAllLines(firstFilePath) 
     .Where(line => int.TryParse(line, out intHolder)) 
     .Select(v => intHolder) 
     .ToArray(); 

    // Get a list of decimals from the second file 
    var fileTwoValues = File 
     .ReadAllLines(secondFilePath) 
     .Where(line => decimal.TryParse(line, out decHolder)) 
     .Select(v => decHolder) 
     .ToArray(); 

    var fileThreeValues = File 
     .ReadAllLines(thirdFilePath) 
     .Where(line => int.TryParse(line, out intHolder)) 
     .Select(v => intHolder) 
     .ToArray(); 

    var fileFourValues = File 
     .ReadAllLines(fourthFilePath) 
     .Where(line => decimal.TryParse(line, out decHolder)) 
     .Select(v => decHolder) 
     .ToArray(); 

    var fileFiveValues = File 
     .ReadAllLines(fifthFilePath) 
     .Where(line => decimal.TryParse(line, out decHolder)) 
     .Select(v => decHolder) 
     .ToArray(); 

    var fileSixValues = File 
     .ReadAllLines(sixthFilePath) 
     .Where(line => decimal.TryParse(line, out decHolder)) 
     .Select(v => decHolder) 
     .ToArray(); 

    var fileSevenValues = File 
     .ReadAllLines(seventhFilePath) 
     .ToArray(); 

    var fileEightValues = File 
     .ReadAllLines(eigthFilePath) 
     .ToArray(); 

    var fileNineValues = File 
     .ReadAllLines(ninthFilePath) 
     .Where(line => float.TryParse(line, out time)) 
     .Select(v => time) 
     .ToArray(); 

    var fileTenValues = File 
     .ReadAllLines(tenthFilePath) 
     .Where(line => int.TryParse(line, out intHolder)) 
     .Select(v => intHolder) 
     .ToArray(); 

    var fileElevenValues = File 
     .ReadAllLines(eleventhFilePath) 
     .Where(line => int.TryParse(line, out intHolder)) 
     .Select(v => intHolder) 
     .ToArray(); 

    // I guess the file lengths should match, but in case they don't, 
    // use the size of the smaller one so we have matches for all items 
    var numItems = Math.Min(fileOneValues.Count(), fileTwoValues.Count()); 

    // Populate an array of new FileData objects 
    var fileData = new FileData[numItems]; 
    for (var index = 0; index < numItems; index++) 
    { 
     fileData[index] = new FileData 
     { 
      File1Value = fileOneValues[index], 
      File2Value = fileTwoValues[index], 
      File3Value = fileThreeValues[index], 
      File4Value = fileFourValues[index], 
      File5Value = fileFiveValues[index], 
      File6Value = fileSixValues[index], 
      File7Value = fileSevenValues[index], 
      File8Value = fileEightValues[index], 
      //File9Value = fileNineValues[index], 
      File10Value = fileTenValues[index], 
      File11Value = fileElevenValues[index] 
     }; 
    } 

    return fileData; 
} 

をバイナリ検索のコード:

static int BinarySearch_R(int key, FileData[] fileData, int low, int high) 
{ 
    if (low > high) return -1; 
    int mid = (low + high)/2; 
    if (key == fileData[mid]) 
    { 

     return mid; 
    } 
    if (key < fileData[mid]) 
    { 
     return BinarySearch_R(key, fileData, low, mid - 1); 
    } 
    else 
    { 

     return BinarySearch_R(key, fileData, mid + 1, high); 
    } 
} 
+0

なぜあなたの 'BinarySearchIterative'メソッドから' object'を返すのですか? 'int'を返すべきではありませんか?または、文字列 '' Nil ''が必要ですか? –

+0

このバイナリ検索は私のプログラムに含まれていません。それは以前私が使っていた在庫の回答から実装しようとしてきたことです。私はそれを明確にすべきだった。 – Duncher

+0

正確に何が問題なのですか?投稿されたコードはたくさんありますが、どの部分が問題を引き起こしていますか? –

答えて

0

あなたのBinarySearchメソッドを一般的なものにする方法を探しているようですさまざまなタイプのオブジェクトで動作します。私はあなたが一般的なように掲示最初のものを変更した以下

、タイプTを実装する型に拘束された場合IComparable<T>(私たちはメソッド内inputArrayにアイテムをkeyを比較できるようにする必要があるため)。

これは、(すべてのIComparableを実装intdecimalstring、およびfloat)あなたがあなたのファイルのために定義されているタイプのために働く必要があります。

/// <summary> 
/// Returns the index of an item in inputArray that matches the value of key 
/// </summary> 
/// <typeparam name="T">The type of objects in the array</typeparam> 
/// <param name="inputArray">An array of items to search</param> 
/// <param name="key">A key item value to search for</param> 
/// <returns>The index of an item that matches key, or -1 if no match is found</returns> 
public static int BinarySearchIterative<T>(T[] inputArray, T key) 
    where T : IComparable<T> 
{ 
    int min = inputArray.GetLowerBound(0); 
    int max = inputArray.GetUpperBound(0); 

    while (min <= max) 
    { 
     int mid = (min + max)/2; 
     int comparison = key.CompareTo(inputArray[mid]); 

     if (comparison == 0) 
     { 
      return mid; 
     } 
     else if (comparison < 0) 
     { 
      max = mid - 1; 
     } 
     else 
     { 
      min = mid + 1; 
     } 
    } 

    return -1; 
} 
+0

ありがとうございました。私は朝、かなり遅いところでお試しになります。私はあなたがどのように乗っているかを知らせます。 – Duncher

+0

メインでこれを呼び出すには、if文を使用しますが、内部ではバイナリ検索に値を渡すために何が使われますか? – Duncher