2016-07-14 9 views
-2

ユーザーはゲームに関する情報を入力してリストビューに追加するゲームライブラリアプリケーションを作成しようとしています。だから私はフォームにも "変更を保存"、 "追加"、および "削除"ボタンがあります。フォームの一番下にアルファベット順にゲームのリストを並べ替える機能を追加しました。私は基本的にリストビューのすべての項目を含む私のリストにQuickSortアルゴリズムを実装しようとしています。リストにはメソッドがあることは理解していますが、自分自身に挑戦し、実際にソートアルゴリズムを実装したいと思います。私はアルゴリズムを書いたが、私はそれに私のリストを実装するのに問題がある。私のコードで左から右へ、右から左へリストをスキャンするのに問題があると思います。私のコードがどこで間違っているのかわからないのですか?これらのアルゴリズムについてはnoobを参照してください)。ここでは以下の私の完全なコードは、それの底にソート方法で、です:私は私のPartition方法ですべての私のエラーを取得リストのQuickSort実装<T>とlistview C#WindowsForms

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace GameLibrary 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     public List<Library> Game = new List<Library>(); 
     public Library lib = new Library(); 

     public void saveBttn_Click(object sender, EventArgs e) 
     { 
      Save save = new Save(); 
      save.saveChanges(this); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Add add = new Add(); 
      add.addGame(this); 
     } 

     private void deleteBtnClick_Click(object sender, EventArgs e) 
     { 
      Delete delete = new Delete(); 
      delete.deleteGame(this); 
     } 

     private void sortBtn_Click(object sender, EventArgs e) 
     { 
      if(alphabeticalSort.Checked == true) 
      { 
       Sorting sort = new Sorting(); 
       sort.quickSortAlphabetical(this, Game.Count()); 
      } 
     } 
    } 
public class Library 
    { 
     public string gametitle 
     { 
      get; 
      set; 
     } 
     public string developer 
     { 
      get; 
      set; 
     } 
     public string publisher 
     { 
      get; 
      set; 
     } 
     public string platform 
     { 
      get; 
      set; 
     } 
    } 
class Save 
    { 
     public void saveChanges(Form1 f) 
     { 
      if (f.gameList.SelectedItems.Count == 1) 
      { 
       f.Game[f.gameList.SelectedItems[0].Index].gametitle = f.titleText.Text; 
       f.Game[f.gameList.SelectedItems[0].Index].developer = f.developerText.Text; 
       f.Game[f.gameList.SelectedItems[0].Index].publisher = f.publisherText.Text; 
       f.Game[f.gameList.SelectedItems[0].Index].platform = f.platformCheckBox.CheckedItems.ToString(); 
      } 
     } 
    } 
class Add 
    { 
     public void addGame(Form1 f) 
     { 
      f.lib.gametitle = f.titleText.Text; 
      f.lib.developer = f.developerText.Text; 
      f.lib.publisher = f.publisherText.Text; 
      f.lib.platform = f.platformCheckBox.CheckedItems.ToString(); 
      f.Game.Add(f.lib); 
      f.gameList.Items.Add(f.lib.gametitle); 
      f.titleText.Clear(); 
      f.developerText.Clear(); 
      f.publisherText.Clear(); 
      foreach (int i in f.platformCheckBox.CheckedIndices) 
      { 
       f.platformCheckBox.SetItemCheckState(i, CheckState.Unchecked); 
      } 
     } 
    } 
class Sorting 
    { 
     public void quickSortAlphabetical(Form1 f, int Size) 
     { 
      quickSort(f.Game, 0, f.Game.Count()); 
     } 

     private static void quickSort(List<Library> list, int left, int right) 
     { 
      if (list == null || list.Count <= 1) 
       return; 

      if (left < right) 
      { 
       int pivotIndex = Partition(list, left, right); 

       quickSort(list, left, pivotIndex - 1); 
       quickSort(list, pivotIndex, right); 
      } 
     } 

     public static int Partition(List<Library> list, int left, int right) 
     { 
      int start = left; 
      int pivot = list[start]; 
      left++; 
      right--; 

      while(true) 
      { 
       while(left <= right && list[left] <= pivot) 
       { 
        left++; 
       } 
       while(left <= right && list[right] > pivot) 
       { 
        right--; 
       } 
       if(left > right) 
       { 
        list[start] = list[left - 1]; 
        list[left - 1] = pivot; 

        return left.ToString(); 
       } 

       int temp = list[left]; 
       list[left] = list[right]; 
       list[right] = temp; 
      } 
     } 
    } 
} 

。私がlist[start]またはlist[right]と呼んだら、「暗黙のうちにタイプ 'GameLibrary.Library'を 'int'に変換することはできないと言われています。これは意味があります。誰もが私のコードのいくつかの有用なフィードバックを与えることができる、私は非常に感謝したい。もう一度、私はまだそう:)

+1

今後の参考として、質問をする際にプログラム全体をダンプしないでください。あなたが持っている特定の問題を再現するのに必要なコードの特定の部分のみを含む良い[mcve]として機能する_new_プログラムを作成します。 –

+0

申し訳ありません。私がそれをしたのは、自分のコードのどこかに問題があるのか​​、それがその特定の部分にあるのか分からなかったからです。 – HylianSith

+1

あなたの質問に良い[mcve]を書く理由の1つは、複数の他の人にその努力を複製させるのではなく、問題がどこにあるかを絞り込む作業だからです。実際、このエクササイズの最も望ましい結果は、あなた自身が問題を把握することです。しかし、あなたがしなくても、コードダンプではなく質問に投稿するのに適したMCVEを少なくとも持っています。 –

答えて

0

私はあなたのpivot変数がLibraryオブジェクトではなくintされるべきだと思ういいことしてください、学んでいます。あなたのコードlist[left] <= pivotString.Compare(list[left].gametitle, pivot.gametitle, false) <= 0に変更する必要がありますので

また、あなたは、2つの文字列を比較することString.Compareメソッドを使用する必要があります。

LibraryクラスにIComparableインターフェイスを実装させることができます。

+0

ありがとうございました。私はそれを考えなかった。私はアルゴリズムが今正しく動作することを確信しています。ソートされたリストをどのようにリストビューに追加することができるのか分かりますか? 'quickSort(f.Game、0、f.Game.Count())の後に' f.gameList.Items.Clear(); 'と' f.gameList.Items.Add(f.lib.gametitle) );そしてそれはアルファベット順であるリスト内の最初の位置にある項目を移動させますが、他の項目は削除します。私は 'for loop'や 'foreach loop'を使わなければならないと確信しています。文字列やオブジェクトを使うときのロジックがどういうものになっているのかちょっと不安です。 – HylianSith

+0

@HylianSith f.Gameがソートされたリストである場合、リスト内のすべての項目を 'foreach loop 'で' foreach(f.Gameのライブラリゲーム){f.gameList.Items.Add(game。 gametitle); } '' – skhugh

+0

@ skhugh8だから、コードを実行して実行するとどうなりますか。私は 'f'という名前のリストに項目を追加し、次に別の名前の 'a'を追加します。私は私のソートボタンをクリックし、それはリストの先頭に 'a'を移動しますが、 'f'は消えます。代わりに、 'f'が移動されたはずの場所に2番目の 'a'があります。リストビューには2つの「a」項目がありますが、それは変です。私はブレークポイントを設定し、f.Gameには2つの項目があることを示していますが、 'a'だけが表示されます。 'foreach'ループが働いていたはずなので、私は私が近づいていることを知っています、他に何が間違っているのか分かりません。 :/ – HylianSith

関連する問題