Mengatasi Array Dua Dimensi saya

Saya hanya ingin bertanya apa cara terbaik untuk mengatasi Array Dua Dimensi (2 Kolom) yang akan menyimpan: Nama Kandidat dan Jumlah Suaranya masing-masing.

Apa yang sebenarnya ingin saya lakukan adalah menerima masukan dari pengguna, katakan: VOTE John 10 dimana John adalah nama kandidat dan 10 adalah suara yang ingin dia berikan kepadanya. Jadi saya perlu menyimpan {John, 10} ke dalam array saya. Namun, setelah ini program saya akan sekali lagi meminta suara pengguna jadi jika saya memasukkan VOTE Doe 15, entri {Doe, 15} kemudian akan ditambahkan ke array. Jika pengguna memasukkan VOTE John 2, array saya perlu diperbarui sehingga nilai barunya adalah {John, 12}.

Saat ini saya menggunakan dua daftar array: CandidateName dan VoteCount dan saya hanya mengandalkan indeksnya untuk memasangkan. Namun, ini tidak terlalu dapat diandalkan, jadi saya mencoba mencari cara lain untuk menyelesaikannya. Namun, saya bukan penggemar array multidimensi.

Bisakah seseorang menunjukkan kepada saya cara yang baik tentang cara mencapai ini?


person Smiley    schedule 20.05.2011    source sumber


Jawaban (6)


Anda harus menggunakan Array Asosiatif. Dalam kasus C#, koleksi tersebut adalah Dictionary.

var votes = new Dictionary<string, int>();
votes["John"] = 10;
votes["Bob"] = 20;
votes["John"] = 15; // replaces earlier setting

Jika Anda ingin menambah suara yang sudah ada, Anda perlu memeriksa apakah ada nilai yang ada:

private Dictionary<string, int> votesByPeep; // initialized in constructor

private void AddVotes(string peep, int votes)
{
    if (this.votesByPeep.ContainsKey(peep)
    {
        this.votesByPeep[peep] += votes;
    }
    else
    {
        this.votesByPeep[peep] = votes;
    }
}
person Paul Ruane    schedule 20.05.2011

Mengapa Anda tidak mendefinisikan struct/kelas dengan dua properti, Nama dan VoteCount. Maka Anda hanya membutuhkan satu array.

Sunting:

Saya menyarankan ini karena mungkin ada operasi atau properti tambahan yang ingin Anda tambahkan ke Kandidat. Jika yang Anda perlukan hanyalah hubungan antara dua nilai ini, kamus adalah solusi yang tepat.

person Nathanael    schedule 20.05.2011

Sepertinya solusi yang jauh lebih baik di sini adalah dengan menggunakan Dictionary<TKey, TValue>. Kamus/tabel hash ideal untuk skenario saat Anda memasangkan nilai (jumlah suara) dengan kunci tertentu (nama pengguna). Itu membuat pembaruan dan skenario pencarian menjadi sangat mudah

class Container {
  private Dictionary<string, int> m_voteMap = new Dictionary<string, int>();

  public void SetVote(string user, int votes) {
    m_voteMap[user] = votes;
  }

  public int GetVotes(string user) {
    int votes;
    if (!m_voteMap.TryGetValue(user, out votes)) {
      votes = 0;
    }
    return votes;
  }
}
person JaredPar    schedule 20.05.2011

Anda dapat menggunakan kamus dari string (nama) hingga int (suara), ini akan memberi Anda pasangan {nama, suara} dan pencarian cepat yang bagus

person Neowizard    schedule 20.05.2011

Buat kelas bernama CandidateVotes, dan simpan dalam koleksi List<CandidateVotes>.

public class CandidateVotes
{
    public string Name {get; set;}
    public int Votes {get; set;}
}
person Ken Smith    schedule 20.05.2011

Ini sepertinya kandidat yang bagus untuk Dictionary<T,U>. Dalam hal ini, Dictionary<string,int>, dengan kuncinya adalah kandidat, dan nilainya adalah penghitungan suara.

// Create dictionary as:
Dictionary<string, int> votes = new Dictionary<string, int>();

Anda kemudian dapat membuat beberapa rutinitas seperti berikut:

void AddVotes(string candidate, int numberOfVotes)
{
    if (this.votes.Contains(candidate))
    {
         // Update the "10 to 12" in your scenario
         int current = this.votes[candidate];
         current += numberOfVotes;
         this.votes[candidate] = current;
    }
    else
         this.votes[candidate] = numberOfVotes; // First time a candidate is used...
}

Saat Anda ingin membuat daftar suara per kandidat, Anda dapat melakukan sesuatu seperti:

foreach(var pair in this.votes)
{
    Console.WriteLine("Candidate {0} has {1} votes.", pair.Key, pair.Value);
}
person Reed Copsey    schedule 20.05.2011