2017-07-12 3 views
1

Apparemment, le ImmutableRangeSet de Gava ne peut pas stocker les plages de chevauchement. Cela a du sens, mais existe-t-il une interface pour résoudre/fusionner les plages de chevauchement, puis placer les plages résultantes dans un ImmutableRangeSet?Création de Gava ImmutableRangeSet à partir des plages de chevauchement

Actuellement, je construis un TreeRangeSet, qui fusionne automatiquement les plages qui se chevauchent, et en passant ce paramètre comme argument à ImmutableRangeSet.builder().addAll(). Ce processus fonctionne, mais il semble un peu trop indirect juste pour résoudre les plages de chevauchement.

Répondre

3

Pouvez-vous être plus précis sur votre cas d'utilisation? Je devinez vous avez une collection de plages et vous essayez de créer ImmutableRangeSet en utilisant la méthode copyOf, qui lance IAE en cas de plages de chevauchement. Voyons ce cas de test:

@Test 
public void shouldHandleOverlappingRanges() 
{ 
    //given 
    ImmutableList<Range<Integer>> ranges = ImmutableList.of(
      Range.closed(0, 2), 
      Range.closed(1, 4), 
      Range.closed(9, 10) 
    ); 
    //when 
    ImmutableRangeSet<Integer> rangeSet = ImmutableRangeSet.copyOf(ranges); 
    //then 
    assertThat(rangeSet.asSet(DiscreteDomain.integers())) 
      .containsOnly(0, 1, 2, 3, 4, 9, 10); 
} 

qui échoue avec

java.lang.IllegalArgumentException: 
Overlapping ranges not permitted but found [0..2] overlapping [1..4] 

Dans ce cas, vous devez utiliser unionOf au lieu de copyOf et passerais:

//when 
ImmutableRangeSet<Integer> rangeSet = ImmutableRangeSet.unionOf(ranges); 
+0

Parfait! 'unionOf' est exactement ce que je cherchais. Je vous remercie! – user12341234