2017-01-31 3 views
0

я должен сравнить два строковых массивов с целыми числами, разделенными входом «#» пользователем следующим образом: вход 1: Размер массива:Сравнение двух строковых массивов хранящие целочисленных значений, разделенных «#»

   3 

вход 2: (Массив 1)

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

вход 2: (Массив 2)

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

Т hey содержат то же самое. целых строк на строку, как определено размером массива ввода пользователя. Например: 1-я строка массива 1 = 1#4#5 = 3 целых строки. В случае, если входные данные массива пусты в любой строке, выход должен быть «недействительным».

Выход должен быть «да», если целочисленные значения в обоих массивах одинаковы независимо от их положения в массиве, т. Е. Если они эквивалентны, в противном случае вывод должен быть «нет». Мой код пропускает очень мало тестовых примеров и в основном дает правильный вывод только тогда, когда два массива транспонируются друг с другом (если смотреть из формата ввода). Он не дает правильного вывода, когда все целые строки в обоих массивах одинаковы независимо от их позиций в массиве.

например. 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; 
    } 
} 
+0

Почему бы не сделать это двухмерным массивом?было бы намного проще сравнивать тогда – XtremeBaumer

+0

Я не могу реализовать двумерный массив для строк в этом случае, так как он может не соответствовать пользовательскому формату ввода. –

+0

имеет ли пользовательский ввод такой формат? – XtremeBaumer

ответ

1

Я переписал ваш эквивалентный метод. Я надеюсь, что он будет использовать 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"; 
    } 

} 

Это делает то, чего вы хотите добиться, с меньшим количеством кода. если вам нужна помощь в понимании или у вас есть другие вопросы, не стесняйтесь спрашивать

+0

Спасибо за этот упрощенный код. Оно работает. –

+0

Структура массива и структура коллекций действительно полезны здесь. Я думаю, мне нужна действительно хорошая практика, чтобы привыкнуть к ним. –

+0

ArrayList хорош, если вы хотите, чтобы простой add/remove и коллекции были такими же, как массивы для сортировки – XtremeBaumer

0

Логика используется, чтобы сделать массив целых чисел, является неправильным, и он произвел недопустимую entries.Try печать значения массива. Все тестовые примеры потерпят неудачу.

Попытка ниже, чтобы преобразовать полукокса в целое число

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

Примечание: Пример 1 должен быть «НЕТ». Во втором входе нет 8.

+0

Вы правы , Логика, которую я использовал, была неправильной. Вся идея добавления элементов массива строк после разбиения на объект StringBuilder и последующего копирования его в массиве символов была нецелесообразна и да, первый пример также был неудачным тестовым примером. –

Смежные вопросы