2015-04-25 5 views
0

Я пытаюсь найти Союз двух массивов, созданных пользователем. Я получаю:Поиск объединения двух массивов

Исключение в потоке "основной" java.lang.ArrayIndexOutOfBoundsException: 4 на TwoSets.main (TwoSets.java:47)

import java.util.Scanner; 

public class TwoSets 
{ 

public static void main(String[] args) 
{ 

    int i, array, choice; 
    Scanner input = new Scanner(System.in); 

    System.out.print("How many numbers do you want in each set? "); 
    array = input.nextInt(); 

    int set1[] = new int[array]; 
    int set2[] = new int[array]; 
    int set3[] = new int[array*2]; 

    for(i=0;i<set1.length;i++) 
    { 
     System.out.print("Enter a number from the first set: "); 
     set1[i] = input.nextInt(); 
    } 

    System.out.print("\n"); 

    for(i=0;i<set2.length;i++) 
    { 
     System.out.print("Enter a number from the second set: "); 
     set2[i] = input.nextInt(); 
    } 

    System.out.print("Enter 1 to find Union\n" + "Enter 2 to find Intersection\n" + "Enter 3 to find Difference\n"); 
    choice = input.nextInt(); 

Код выше инициализирует и получение пользовательского ввода, который работает нормально. Ниже приведен код, который не работает.

if(choice == 1) 
    { 
     for(i=0;i<array;i++) 
     { 
      set3[i] = set1[i]; 
     } 

     for(i=array;i<array*2;i++) 
     { 
      boolean check = Union(set2[i], set3); 
      if(check == false) 
      { 
       set3[i] = set2[i]; 
      } 
     } 
     for(i=0;i<set3.length;i++) 
     { 
      System.out.print(set3[i]); 
     } 
    } 
} 

public static boolean Union(int number, int[] array) 
{ 
    for (int i : array) 
    { 
     if (i == number) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
} 
+2

Можете ли вы на самом деле использовать реализацию Set? –

ответ

1

Этот код выходит за пределы, когда пытается проверить положение индекса в set2, которое больше длины set2.

Вы заметите, что при итерации через массив * 2 вы пытаетесь отправить set2 [i] в ​​union(). Это не будет работать, как только i будет больше или равно set2.length. Здесь возникает ваша ошибка.

for(i=array;i<array*2;i++) 
     { 
      boolean check = Union(set2[i], set3); 
      if(check == false) 
      { 
       set3[i] = set2[i]; 
      } 
     } 

Вам нужно только перебрать длину-1 из набора2 в этот метод.

for(i=array;i<array;i++) 
    { 
     boolean check = Union(set2[i], set3); 
     if(check == false) 
     { 
      set3[i] = set2[i]; 
     } 
    } 
+0

Хорошо, я вижу, как это испортит это –

1

set2 имеют длину массива, но:

for(i=array;i<array*2;i++) 
     { 
      boolean check = Union(set2[i], set3); 
      if(check == false) 
      { 
       set3[i] = set2[i]; 
      } 
     } 

используется массив * 2 в цикле. Я думаю, что это ошибка.

+0

Aw man. Ninja'd – grill

1
import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

public class TwoSet { 
    public static void main(String[] args) 
    { 
    Set<Integer> set1 = new HashSet<>(Arrays.asList(new Integer [] {1,2,3,4})); 
    Set<Integer> set2 = new HashSet<>(Arrays.asList(new Integer [] {3,4,5,6})); 
    Set<Integer> set3 = new HashSet<>(); 
    set3.addAll(set1); 
    set3.addAll(set2); 
    set3.forEach((i)->{System.out.println("set3: "+i);}); 
    } 
} 
+1

Если это вопрос для практической реализации, то вы хороши. Если это для школьного задания, то это, вероятно, поможет вам сделать zap-scotch-notch. – YoYo

+0

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

+0

Вы можете сохранить и свое, и это. Просто вместо 'Arrays.asList (новый Integer [] {1,2,3,4})', используйте 'Arrays.asList (originalSet1)'. В основном подавайте исходный массив, который вы собрали с пользовательского ввода, и пусть HashSet делает все для вас волшебство. Если вы в порядке с помощью Set ... вы также можете использовать 'set1.add (input.nextInt)'. – YoYo

1

Вы можете избавиться от исключения, изменив свой код следующим образом

 for(i=0; i<array;i++) 
    { 
     boolean check = Union(set2[i], set3); 
     if(check == false) 
     { 
      set3[i+array] = set2[i]; 
     } 
    } 

Однако это оставит пробелы, где были бы общие элементы.

Вы, вероятно, будет лучше делать что-то вроде

j= array; 
    for(i=0; i<array;i++) 
    { 
     boolean check = Union(set2[i], set3); 
     if(check == false) 
     { 
      set3[j] = set2[i]; 
      j++;     
     } 
    } 

Затем используйте копию массива, чтобы создать новый массив нужной длины и скопировать густонаселенные элементы более.

Использование списка для set3 устранит необходимость в последнем шаге.

Использование набора для set3 сделает его более простым.

+0

Спасибо, что это сработало !! –

+0

Вы должны отметить правильный ответ и добавить полезные комментарии, чтобы помочь людям, которые задают этот вопрос позже. – redge

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