2012-05-26 53 views
-3

我只是想编写比较一维数组与二维数组的代码......我正在编写一个编译器,并且想要比较一个包含我的代码的一维数组和其中我已经创建了一个符号表的一维数组。 我写了代码,但它不工作。在C#中比较一个2D和一个一维数组?

for (int x = 0; x < symboltable1.Length; x++) 
{ 
    for (int y = 0; y < symboltable1.Length; y++) 
    { 
     for (int z = 0; z < text.Length; z++) 
     { 
      if (symboltable1[x,y] == text[z]) 
       listBox2.Items.Add(text[z]); 
      else 
       MessageBox.Show("poor"); 
     } 
    } 
} 
+4

之前,我们可以帮你,你需要告诉我们你想在一维和二维数组之间的比较要实现什么来帮助我们。 – mauris

+1

顺便说一句,如果这些2D - 1D数组有很多元素,你应该考虑切换到某种散列表... – digEmAll

+0

如果你想比较对象,你应该使用object.equals(object2) – warbio

回答

0

你的方法太慢O(N * M * L)(其中是文本的长度,ñ & 你的符号表的尺寸。)

将您的符号表转换为排序后的索引表会给你一个O(l * log(n * m)),并且使用散列表会给你一个几乎O(l)。

我实现了三个办法只是为了好玩:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace test 
{ 
    class Program 
    { 
     class IndexElement:IComparable<IndexElement> 
     { 
      public string value; 
      public int x; 
      public int y; 
      public IndexElement(string v,int x,int y) 
      { 
       this.value = v; 
       this.x = x; 
       this.y = y; 
      } 

      public int CompareTo(IndexElement other) 
      { 
       return value.CompareTo(other.value); 
      } 
     } 

     struct Position 
     { 
      public int x; 
      public int y; 
      public Position(int x, int y) 
      { 
       this.x = x; 
       this.y = y; 
      } 
     } 
     static void Main(string[] args) 
     { 
      string[,] symbols = new string[,] { { "if", "else" }, { "for", "foreach" }, { "while", "do" } }; 
      string[] text = new string[] { "for", "int", "in", "if", "then" }; 
      Dictionary<string, Position> dictionary = BuildDict(symbols); 
      IndexElement[] index = BuildIndex(symbols); 
      Console.WriteLine("Brute:"); 
      foreach (string s in CompareUsingBrute(text, symbols)) 
      { 
       Console.WriteLine(s); 
      } 
      Console.WriteLine("Dict:"); 
      foreach (string s in CompareUsingIndex(text, dictionary)) 
      { 
       Console.WriteLine(s); 
      } 
      Console.WriteLine("Indexing:"); 
      foreach (string s in CompareUsingDictionary(text, index)) 
      { 
       Console.WriteLine(s); 
      } 
      Console.ReadKey(); 
     } 

     private static List<string> CompareUsingBrute(string[] text, string[,] symbols) 
     { 
      List<string> res = new List<string>(); 
      for (int x = 0; x < symbols.GetLength(0); x++) 
      { 
       for (int y = 0; y < symbols.GetLength(1); y++) 
       { 
        for (int z = 0; z < text.Length; z++) 
        { 
         if (symbols[x, y] == text[z]) 
          res.Add(text[z]);       
        } 
       } 
      } 
      return res; 

     } 

     private static List<string> CompareUsingDictionary(string[] text, IndexElement[] index) 
     { 
      List<string> res = new List<string>(); 
      foreach (string s in text) 
      { 
       if (Array.BinarySearch<IndexElement>(index, new IndexElement(s, 0, 0)) >= 0) 
       { 
        res.Add(s); 
       } 
      } 
      return res; 
     } 

     private static IndexElement[] BuildIndex(string[,] symbols) 
     { 
      IndexElement[] res = new IndexElement[symbols.Length]; 
      int index = 0; 
      for (int i = 0; i < symbols.GetLength(0); i++) 
      { 
       for (int j = 0; j < symbols.GetLength(1); j++) 
       { 
        res[index] = new IndexElement(symbols[i, j], i, j); 
        index++; 
       } 

      } 
      Array.Sort(res); 
      return res; 
     } 

     private static List<string> CompareUsingIndex(string[] text, Dictionary<string, Position> dictionary) 
     { 
      List<string> res = new List<string>(); 
      foreach (string s in text) 
      { 
       Position p; 
       if (dictionary.TryGetValue(s,out p)) 
       { 
        res.Add(s); 
       } 
      } 
      return res; 
     } 

     private static Dictionary<string, Position> BuildDict(string[,] symbols) 
     { 
      Dictionary<string, Position> res = new Dictionary<string, Position>(); 
      for (int i = 0; i < symbols.GetLength(0); i++) 
      { 
       for (int j = 0; j < symbols.GetLength(1); j++) 
       { 
        res.Add(symbols[i, j], new Position(i, j)); 
       } 
      } 
      return res; 
     } 


    } 
} 
+0

谢谢你非常多的帮助...我可以知道如何在列表框中添加res []的元素? –

+0

foreach(IndexElement e in res){Listbox.Items.Add(e.Value);} –

3

我想你的错误可能是在检查数组长度。
试试这个:

for (int x = 0; x < symboltable1.GetLength(0); x++) 
{ 
    for (int y = 0; y < symboltable1.GetLength(1); y++) 
    { 
     for (int z = 0; z < text.Length; z++) 
     { 
      if (symboltable1[x,y] == text[z]) 
       listBox2.Items.Add(text[z]); 
      else 
       MessageBox.Show("poor"); 
     } 
    } 
} 
+0

no ..它genetrats一个错误,我们可以改变布尔到字符串和它的正确的原因在逻辑上v正在实现循环错误 –