Mam tablicę ze zduplikowanymi obiektami, powiedzmy: [A, A, B, C]. Za pomocą pętli for łączę nazwy duplikatów w ciąg. Próbowałem tego:

for (var i = 0; i < myArray.data.length - 1; i ++) {
  for (var j = i + 1; j < myArray.data.length; j ++) {
    if (myArray.data[i].id == myArray.data[j].id) {
      identicalObjects = identicalObjects + myArray.data[i].name + ", " + myArray.data[j].name;
    }
  }
}

To drukuje: „A, A”, co jest poprawne. Jeśli jednak tablica to [A, A, A, B, C], wyświetla "A, A, A, A, A, A", co nie jest poprawne, są tylko 3 duplikaty, a nie 6. Nie mogę po prostu wyciąć ciąg znaków, ponieważ w niektórych przypadkach różne obiekty (z różnymi identyfikatorami) są zwracane jako duplikaty i muszę znać ich nazwy, aby wiedzieć, które dokładnie to są.

Jednym z rozwiązań, które przychodzą mi do głowy, jest przechowywanie nazw w tablicy, a jeśli liczba o tej samej nazwie jest większa niż 2, zmniejsz liczbę pozostałych o połowę, a następnie zamień na ciąg. Czy jest jednak coś prostszego i wydajniejszego?

0
Smk 20 listopad 2019, 19:53
Dodajesz myArray.data[i].name dwa razy, wypróbuj identicalObjects += (identicalObjects ? ", " : "") + myArray.data[i].name
 – 
Titus
20 listopad 2019, 20:04

3 odpowiedzi

Jeśli jednak tablica to [A, A, A, B, C], wyświetla „A, A, A, A, A, A”

Dzieje się tak, ponieważ gdy i = 0 i j = 1, otrzymujesz dopasowanie, a identyczne obiekty są ustawione na „A, A”. Otrzymasz kolejne dopasowanie, gdy i = 0 i j = 2 i ustaw identyczne obiekty na poprzednią wartość plus „A, A”. Następnie otrzymujesz kolejne dopasowanie, gdy i = 1 i j = 2 i wykonujesz tę samą konkatenację.

Dlaczego nie użyć obiektu Map i użyć obiekt jako klucz, a wartością jest liczba?

0
Justin Guerin 20 listopad 2019, 20:10
1
Nie jest to prawdą, ponieważ druga iteracja zaczyna się od i + 1, podejście OP zacznie zawodzić dopiero po 4 lub więcej duplikatach. Oto test jsbin.com/gaxelenowe/edit?js,console
 – 
Titus
20 listopad 2019, 20:21
Nie chodziło mi o to, że algorytm znalazł 3 dopasowania, chodziło o to, że wypisywał "A, A" dla każdego znalezionego dopasowania. Więc gdy są 3 dopasowania, otrzymujesz 3 * "A, A".
 – 
Justin Guerin
20 listopad 2019, 21:11

To może nie być najprostszy sposób na wdrożenie tego, ale myślę, że powinno to wykonać zadanie.

var uniqueLetters = myArray.filter(distinct);

for(var i = 0; i < uniqueLetters.length; i++){
    for(var j = 0; j < myArray.Length; j++){

        if(myArray.data[j] == uniqueLetters[i]){
            identicalObjects = identicalObjects + myArray.data[i].name + ", " + myArray.data[j].name;
        }
    }
}

Na przykład. Powiedzmy, że masz tablicę [A, A, B, C]. uniqueLetters będzie zawierać [A, B, C]. następnie przechodząc przez oryginalną tablicę, porównujesz ją z inną tablicą.

Ponownie, prawdopodobnie nie jest to najprostszy sposób radzenia sobie z tym, ale powinien działać.

0
Dortimer 20 listopad 2019, 20:56

Konwertowanie tablicy obiektów na List jest łatwiejsze i bardziej elastyczne. Lista jest potężniejsza i możesz z nią zrobić o wiele więcej rzeczy.

W swoim przykładzie próbujesz znaleźć duplikaty na podstawie identyfikatorów. Dzięki liście można to osiągnąć w jednym zdaniu.

Map<Integer, List<YourObject>> yourObjectMap = empArray.stream().collect(Collectors.groupingBy(YourObject::getId));

0
v_a_p 21 listopad 2019, 03:51