2012-06-05 79 views
2

我需要創建一個有許多行和兩列以上的表格。建議一個好的和快速的數據結構。我不會更新和刪除該表中的一些條目。我將只使用查找功能。
例如,我有一個表:
表的數據結構?

 
    | column 1 | column 2 | column 3| 
a | asd  | awd  | asfc | 
b | asgf  | aasf  | asgfc | 

我有:

 
String a = "column 1" 
String b = "b" 
String c = find(a,b); 

在結束在c的值應爲asgf

+1

這完全取決於數據你將要存儲。你需要提供更多關於你想要做什麼的信息。 – Config

+2

你會查找什麼? –

+0

那些將字符串 –

回答

0

您必須使用基於散列表的關聯數組(所謂的字典)。查找的平均時間複雜度 - 最差情況下爲O(1 + n/k)和O(n)。您必須將表格組織爲列的字典(列名稱爲鍵)。和列必須是值的字典(與行的名稱爲重點)

更多信息:

http://en.wikipedia.org/wiki/Dictionary_(data_structurehttp://en.wikipedia.org/wiki/Hash_table

實例C#:

using System; 
using System.Collections; 
using System.Collections.Generic; 

namespace Test { 
    public class Test 
    { 
     class Table { 
      class Column { 
       public Dictionary<string, string> cells; 

       public Column() { 
        cells = new Dictionary<string, string>(); 
       } 

       public string Find(string rowName) { 
        string resultValue; 
        if (cells.TryGetValue(rowName, out resultValue)) 
         return resultValue; 
        else 
         throw new Exception("oops, no such cell"); 
       } 
      } 

      Dictionary<string, Column> columns; 
      List<string> rowNames; 

      public Table() { 
       columns = new Dictionary<string, Column>(); 
       rowNames = new List<string>(); 
      } 

      public void AddColumn(string columnName, params string[] values) { 
       Column column = new Column(); 
       columns.Add(columnName, column); 

       // fill new cells 
       int counter = 0; 
       foreach (string rowName in rowNames) { 
        if (counter < values.Length) 
         column.cells.Add(rowName, values[counter]); 
        else 
         column.cells.Add(rowName, ""); 
        counter++; 
       } 
      } 

      public void AddRow(string rowName, params string[] values) { 
       rowNames.Add(rowName); 

       // fill new cells 
       int counter = 0; 
       foreach (KeyValuePair<string, Column> columnPair in columns) { 
        Column column = columnPair.Value; 
        if (counter < values.Length) 
         column.cells.Add(rowName, values[counter]); 
        else 
         column.cells.Add(rowName, ""); 
        counter++; 
       } 
      } 

      public string Find(string columnName, string rowName) { 
       Column resultColumn; 
       if (columns.TryGetValue(columnName, out resultColumn)) 
        return resultColumn.Find(rowName); 
       else 
        throw new Exception("oops, no such cell"); 
      } 
     } 

     public static void Main() 
     { 
      Table table = new Table(); 
      table.AddRow("a"); 
      table.AddRow("b"); 
      table.AddColumn("column 1", "asd", "asgf"); 
      table.AddColumn("column 2", "awd", "aasf"); 
      table.AddColumn("column 3", "asfc", "asgfc"); 
      Console.WriteLine(table.Find("column 1", "b")); 
     } 
    } 
} 
+0

P.S:示例不能添加重複的行和列 –

+0

當您爲每個單元格和行分配非常大的對象時,看起來效率不高。另外,你在任何地方複製列名稱(如鍵)。我寧願創建一個具有列名內部數組的類和記錄列表的列表。而且該列表可以很容易地換成矢量或鏈接列表,以加快查找速度。 –