【问题标题】:Comparing two String arrays storing integer values separated by "#"比较存储由“#”分隔的整数值的两个字符串数组
【发布时间】:2017-06-16 22:41:10
【问题描述】:

我必须将两个字符串数组与用户输入的由“#”分隔的整数值进行比较,如下所示: 输入1:数组的大小:

             3 

输入 2:(数组 1)

           1#4#5
           3#6#7 
           5#8#9

输入 2:(数组 2)

           1#3#5 
           4#6#7 
           5#7#9

它们包含相同的编号。每行的整数字符串由用户输入数组大小指定。例如:数组 1 的第一行 = 1#4#5 = 3 个整数字符串。 如果数组输入的任何一行都是空白的,则输出应该是“无效的”。

如果两个数组中的整数值相同,而不管它们在数组中的位置如何,输出应该是“yes”,即如果它们是等价的,否则输出应该是“no”。 我的代码通过了很少的测试用例,并且仅在两个数组相互转置时(从输入格式来看)才给出正确的输出。当两个数组中的所有整数字符串都相同时,无论它们在数组中的位置如何,它都不会给出正确的输出。

例如。 1:测试用例通过:

上例中数组的输出是yes

eg.2:测试用例失败:

输入1:数组大小:

             2 

输入 2:(数组 1)

           1#6
           3#4 

输入 2:(数组 2)

           6#3 
           4#1 

输出:no

这是我的代码:

import java.util.Scanner;
import java.util.Arrays;

public class StringComparison
{
   public static void main (String[]args)
{
  Scanner input = new Scanner (System.in);
  // Input the array size
  System.out.println("Enter the array size:");
  int size = input.nextInt();
  input.nextLine();
  String[] s1 = new String[size];
  String[] s2 = new String[size];

  // Input 1st array elements
  System.out.println("Enter the 1st array elements:");
  for (int i=0;i<size; i++)
  {
    s1[i]= input.nextLine();
  }
  // Input 2nd array elements
  System.out.println("Enter the 2nd array elements:");
   for (int i=0;i<size; i++)
  {
    s2[i]= input.nextLine();
  }
   // Check for equivalence
  System.out.println(equivalent (size, s1, s2));

}

  public static String equivalent (int input1, String[]input2, String[]input3)
  {
    String result =null;
    StringBuilder sb1 = new StringBuilder();
    StringBuilder sb2 = new StringBuilder();
    char []b1 = new char[input1*input1];
    char[]b2 = new char[input1*input1];
    int[] num1 = new int[input1*input1];
    int[] num2 = new int[input1*input1];
   for (int i=0; i<input1;i++)
   {
     String[] a1 = input2[i].split("#");
     // if the user inputs are less or more than required
     try 
     {
       for (int j=0;j<input1;j++)
      sb1.append (a1[j]);
     }
     catch (java.lang.ArrayIndexOutOfBoundsException e)
     {
      result ="invalid";
      return result;
     }
     }

   for (int i=0; i<input1;i++)
   {
     String[] a2 = input3[i].split("#");
     // if the user inputs are less or more than required
    try 
     {
       for (int k=0;k<input1;k++)
      sb2.append (a2[k]);
     }
     catch (java.lang.ArrayIndexOutOfBoundsException e)
     {
      result ="invalid";
      return result;
     }
     }

  // Storing the contents of the StringBuilder objects in a char array
   sb1.getChars (0,((input1*input1)-1),b1,0);
   sb2.getChars (0,((input1*input1)-1),b2,0);

   // Converting the elements of the char array into integers and storing it in an int array
   for (int p=0; p<((input1*input1)-1);p++)
   {
     num1[p] = Character.digit( b1[p],(input1*input1)-1); 
   }
    // Converting the elements of the char array into integers and storing it in an int array
   for (int q=0; q<((input1*input1)-1);q++)
   {
     num2[q] = Character.digit( b2[q],(input1*input1)-1); 
   }
   // Sorting the two integer arrays
    Arrays.sort (num1);
    Arrays.sort (num2);

   if (Arrays.equals (num1,num2))
   {
     result = "yes"; 
   }
    else
   {
    result ="no";
   }
    return result;
   }
}

【问题讨论】:

  • 为什么不把它做成一个二维数组呢?那么比较起来会容易得多
  • 在这种情况下,我不会为字符串实现二维数组,因为它可能不符合用户输入格式。
  • 用户输入是否必须具有该格式?
  • 是的。它必须是那种格式。
  • 我不会为字符串实现二维数组 只是String[][] name = new String[value][value];

标签: java arrays string char int


【解决方案1】:

你用来制作整数数组的逻辑是错误的,它产生了无效的条目。尝试打印数组值。所有的测试用例都会失败。

尝试下面将字符转换为整数

num2[q] = Integer.parseInt(String.valueOf(b2[q]));
num1[p] = Integer.parseInt(String.valueOf(b1[p]));

注意:示例 1 应该是“否”。第二个输入中没有 8。

【讨论】:

  • 你是对的。我使用的逻辑不正确。在拆分为 StringBuilder 对象后附加字符串数组的元素然后将其复制到 char 数组中的整个想法没有用,是的,第一个示例也是一个失败的测试用例。
【解决方案2】:

我已经重写了您的等效方法。我希望可以使用 ArrayList。

private static String equivalent(String[] s1, String[] s2) {
    ArrayList<Integer> num1 = new ArrayList<Integer>();
    ArrayList<Integer> num2 = new ArrayList<Integer>();
    for (String str : s1) {
        String[] storage = str.split("#");
        for (String st : storage) {
            num1.add(Integer.parseInt(String.valueOf(st)));
        }
    }
    for (String str : s2) {
        String[] storage = str.split("#");
        for (String st : storage) {
            num2.add(Integer.parseInt(String.valueOf(st)));
        }
    }
    Collections.sort(num1);
    Collections.sort(num2);
    if (num1.equals(num2)) {
        return "yes";
    } else {
        return "no";
    }

}

这可以用更少的代码完成您想要实现的目标。如果您需要帮助理解或有任何其他问题,请随时提出

【讨论】:

  • 数组列表和集合框架在这里非常有用。我认为我需要非常好的练习才能习惯它们。
  • ArrayList 如果你想要一个简单的添加/删除是很好的,并且集合与用于排序的数组一样
  • 你的代码真的很棒,逻辑也很棒。非常感谢。
猜你喜欢
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
相关资源
最近更新 更多