如何比较表?

时间:2011-09-19 14:19:52

标签: java arrays

在下面的代码中,我计算字符串的数量然后尝试检查该数字匹配值 代码是正确的,但我不知道如何比较矩阵与计数值:

例如:计数器1给出:

10
150
10
0
200

我需要检查那是否匹配值?

int[][] values = { { 10, 150, 10, 0, 10, 200 }, { 20, 5, 18, 60, 14, 0 }, { 16, 5, 18, 20, 25, 30 } };

for (int i = 1; i < 4;i++)
    {    
      //do action here
      int counter1 = 0;
      int counter2 = 0;
      int counter3=0;
      int counter4=0;
      int counter5=0;
      int counter6=0;   

      for (int j = 0; j < myTableNbRows; i++)
      {
        if (myTable.getValue(j, 0).matches("hello"))
        {
          if (myTable.getValue(j, 1).contains("tions."))
          {
            counter1++;
          }
        if (myTable.getValue(j, 1).contains("ons."))
          {
            counter2++;
          }
     if (myTable.getValue(j, 1).contains("an."))
          {
            counter3++;
          }
      if (myTable.getValue(j, 1).contains("auns."))
          {
            counter4++;
          }
    if (myTable.getValue(j, 1).contains("896."))
          {
            counter5++;
          }
     if (myTable.getValue(j, 1).contains("1222."))
          {
            counter6++;
          }

        }
      }
//here I nedd to compare values with counter 
 assertEquals(values,counter1);
 assertEquals(values,counter2);

...

3 个答案:

答案 0 :(得分:0)

也许你应该看看

Character.toString()

方法

答案 1 :(得分:0)

两种选择...... 将计数器存储在一个数组中并在循环中调用assert

for (int t = 0; t<counters.length; t++) {
   assertEquals(values[i][t], counters[t]);
}

另一种选择是使用Hamcrest Matchers。例如,IsArrayContainingInOrder。

IsArrayContainingInOrder

for (int i = 1; i < 4;i++)
{    
  //do action here
  int[] counters = new int[6];

  for (int j = 0; j < myTableNbRows; i++)
  {
    if (myTable.getValue(j, 0).matches("hello"))
    {
      if (myTable.getValue(j, 1).contains("tions."))
      {
        counters[0]++;
      }
    ...
    ...
    }

   for (int t = 0; t<counters.length; t++) {
     assertEquals(values[i][t], counters[t]);
   }
   // or preferred method
   assertThat(counters, IsArrayContainingInOrder.arrayContaining(values[i]));
} 

答案 2 :(得分:0)

我不确定values实际代表什么,但假设它应该是一组需要匹配的已定义计数(即你有(counter1==10 AND counter2==150 ...) OR (counter1==20 AND counter2==5 ...) ...),那么尝试这样的事情:< / p>

boolean matchFound = false;
for( int[] valuesRow : values ) {
   matchFound = valuesRow[0] == counter1 && valuesRow[1] == counter2 ...;
   if( matchFound) {
     break;
   }
} 

请注意,通常,您应该创建一个counter数组:int[] counter = new int[6];并增加数组内容。然后你可以循环遍历值行,如上所示,但比较另一行中的元素:

boolean matchFound = false;
for( int[] valuesRow : values ) {
   boolean rowMatches = true; //assume a match
   for( int i = 0; i < counters.length; i++ ) {
     if( valuesRow[i] != counters[i] ) {
       rowMatches = false;
       break; //break the inner loop
     }
   }
   if( rowMatches ) {
     matchFound = true;
     break; //the outer loop
   }
} 

作为旁注:您也可以使用循环标签,并在找到不匹配的值后直接继续外循环。

编辑:重读代码,我意识到你有4个值数组并循环遍历4(?)数据集/表。

但是,有一些问题:

  1. for (int j = 0; j < myTableNbRows; i++)您正在递增i而不是j正如我认为的那样正确
  2. 您需要在该循环中调用assert,因为外部counter1等不可见。
  3. 那就是说,你的断言是这样的(在内循环中):

    assertEquals(values[i-1][0], counter1); //note that you loop i from 1 to 4 so you need to subtract 1 (array indices are 0 to 3)
    assertEquals(values[i-1][1], counter2);
    ...
    

    EDIT2: 如果你想在外循环之后进行断言,你需要使计数器成为一个二维数组:int[][] counter = new int[4][6];并增加如下:counter[i-1][j]++;(注意i-1如上所述) 。然后循环遍历valuescounter并进行比较。