2015-04-01 3 views
1

Так что я недавно получил следующий вопрос в техническом интервью, и я подумал, что это довольно интересно.Пересечение набора с завихрением Java

Данные два массива: A = {1,2,2,4,5} и B = {1,2,6,} записывают код, который выполняет следующие две операции: AB {2,4,5} и BA {6}. Значит, вы найдете общий элемент в другом массиве и удалите его из оригинала. Также, если B было {1,2}, тогда B-A будет просто {}, поскольку A содержит все элементы B и B не имеет уникальных элементов.

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

public static void main(String args[]) { 
Map hashtable = new HashMap(); 

int a[] = {1,1,2,4,5,6,6}; 
int b[] = {1,2,6}; 

ArrayList ba = new ArrayList(); 
ArrayList ab = new ArrayList(); 
int[] occurances = new int[a.length]; 
//int occurances = 0; 
for (int i = 0; i < a.length; i++) { 
    occurances[a[i]]++; 
    hashtable.put(a[i], occurances[a[i]]); 

} 
//System.out.println(Arrays.toString(occurances)); 
System.out.println(hashtable); 
//find BA 
for (int i = 0; i < b.length; i++) { 
    if(hashtable.containsKey(b[i])) { 
     occurances[b[i]]--; 
     hashtable.put(b[i], occurances[b[i]]); 
    } else ba.add(b[i]); 


} 
for(int i = 0; i <a.length; i++) { 
    if(hashtable.containsKey(a[i]) && occurances[a[i]] != 0) { 
     ab.add(a[i]); 
     occurances[a[i]]--; 
     hashtable.put(a[i], occurances[a[i]]); 

    } 

} 

System.out.println("AB = " + ab); 
System.out.println("BA =" + ba); 

} 
} 

**** EDIT ***** я ошибочно назвал массивы Sets, когда я изначально поставил вопрос. Поскольку массивы могут иметь повторяющиеся элементы, они по определению не являются Sets. Извините за путаницу.

+1

'Карта hashtable' .... мои глаза X_x – gtgaxiola

+4

' {1,2,2,4,5} 'не набор. – dasblinkenlight

+0

Было бы предложено реализовать ваши наборы A и B с java Set. У вас будет меньше работы, чем реализация наборов списком – gefei

ответ

1

Это может быть сделано только с помощью стандартных операций Set

Set<Integer> a; //assume initialized with {1,2,4,5} 
Set<Integer> b; //assume initialized with {1,2,6} 

a.removeAll(b); 
System.out.println(a); 

должны дать:

[4, 5] 

Если вместо этого вы делаете:

b.removeAll(a); 
System.out.println(b); 

Тогда вы получите

[6] 
+0

К сожалению, это не работает для дубликатов. Если A равно {1,2,2,3} a b, то {2,4} A-B должно быть {1,2,3}, если только один 2 найден в b удален. Операции с набором удаляли бы все вхождения 2 в a. –

+1

Ну, тогда A = {1,2,2,3} по определению НЕ является множеством. – gtgaxiola

+0

Моя ошибка. Я думаю, они просто массивы. –

2

Вы можете использовать Set, которые имеют функции соединения и пересечения.

Integer a[] = {1, 2, 2, 4, 5}; 
Integer b[] = {1, 2, 6}; 

public void test() { 
    // Grow the two sets from the arrays. 
    Set<Integer> sa = Arrays.stream(a) 
      .collect(Collectors.toCollection(TreeSet::new)); 
    Set<Integer> sb = Arrays.stream(b) 
      .collect(Collectors.toCollection(TreeSet::new)); 
    // Make a new one so I don't damage sa or sb. 
    Set<Integer> sc = new HashSet<>(sa); 
    sc.removeAll(sb); 
    System.out.println(sa + " - " + sb + " = " + sc); 
    Set<Integer> sd = new HashSet<>(sb); 
    sd.removeAll(sa); 
    System.out.println(sb + " - " + sa + " = " + sd); 
} 

печатает

[1, 2, 4, 5] - [1, 2, 6] = [4, 5] 
[1, 2, 6] - [1, 2, 4, 5] = [6] 
Смежные вопросы