2017-10-03 10 views
0

Je dois créer un programme qui trouvera commonDates dans une liste de personnes.Out of BoundsException

public DateSet commonDates() { 
     if (persons.size() >= 2) { 
      DateSet Cdates = 
persons.get(0).getDateSet().intersection(persons.get(1).getDateSet()); 
      for (int i = 2; i < persons.size(); i++) { 
       Cdates = Cdates.intersection(persons.get(i).getDateSet()); 
      } 
      return Cdates; 
     } 
     else { 
      throw new IllegalArgumentException(); 
     } 
    } 

c'est la méthode d'intersection:

public DateSet intersection(DateSet other) { 
    DateSet dates2 = (DateSet) other; 
    DateSet NewDateSet = new DateSet(); 
    for(int i = 0; i < dates.size(); i++) { 
     if (dates.get(i).equals(dates2.dates.get(i))) { 
      NewDateSet.add(dates.get(i)); 
     } 
    } 
    return NewDateSet; 
} 

Le test JUnit pour commonDates ressemble à ce

@Test 
public void testCommonDates() { 
    DatePicker persons = new DatePicker(); 
    List<Date> dates = new ArrayList<Date>(); 
    Person P1 = new Person("Joop"); 
    Person P2 = new Person("Joopie"); 
    Person P3 = new Person("Jaapie"); 
    Date D1 = new Date("maandag"); 
    Date D2 = new Date("dinsdag"); 
    dates.add(D1); 
    persons.addPerson(P1); 
    persons.addPerson(P2); 
    P1.add(D1); 
    P2.add(D1); 
    P3.add(D1); 
    P1.add(D2); 
    assertThat("commonDates should return dates all persons have in common", persons.commonDates(), equalTo(dates)); 
} 

Ce sont les messages d'erreur que je reçois These are the error messages that i get

Merci en avance

+1

Il serait vraiment utile si vous réduisiez cela à un [mcve] - et suivez les conventions de nommage Java que vous allez. Bien que nous ayons tout ce dont nous avons besoin pour reproduire cela, il y en a plus que nécessaire, et ce n'est pas sous une forme pratique à reproduire. De plus, vous ne nous avez pas dit ce que vos investigations diagnostiques ont montré. (Indice: Je suis assez sûr que le problème est que votre méthode 'intersection' suppose que les deux' DateSet' ont le même nombre d'entrées ...) –

+0

La plupart des types de données que vous mentionnez dans le code ne font pas partie de Java Standard , Quels sont ces? –

+0

Pouvez-vous essayer size() - 1 pour chaque boucle? –

Répondre

1

Vérifiez la boucle

for (int i = 2; i < persons.size(); i++) { 
       Cdates = Cdates.intersection(persons.get(i).getDateSet()); 
} 

Vos for -loop variables i commence avec la valeur initiale 2 et incrémente, alors qu'il devrait être décrémentation, non?

0

Je suggère de créer un test séparé pour la méthode public DateSet intersection(DateSet other), car il y a votre problème. Il semble qu'il y ait un problème car il s'attend à la même longueur des ensembles.

Vous devriez probablement utiliser quelque chose comme

Set<Date> intersection = new HashSet<>(dates1); 
intersection.retainAll(dates2); 

au lieu d'utiliser les types de données personnalisées.