2017-02-08 2 views
1

Я делаю datastucture, где я могу:Как заменить объекты Integer с примитивами

  • добавить пару с начальными и конечными точками
  • может получить список испытаний пара
  • интервала для имеющих пробелов

Например (0,4), (6,8) проверить (2,4) - true проверить (0), (0) (3,8) - ложь, поскольку существует разрыв между 4 и 6.

Как я могу изменить код ниже, например, установить list и список data будет содержать примитивные int вместо объекта Integer?

EDIT: Я знаю, что дженерики java не могут быть примитивными, поэтому список невозможно. Моя мотивация исходит от реализации других данных.
eh HashMap < Целое, Объект> в основном то же самое, что android SparseArray с diffenrece, что SparseArray использует ints вместо целых чисел для ключей.

public class GapAwareList { 
    Set<Integer> list = new HashSet<>(); 

    public void put(int start, int end) { 
    for (int i = start; i <= end; i++) { 
     list.add(i); 
    } 
    } 

    public void remove(int start, int end) { 
    for (int i = start; i <= end; i++) { 
     list.remove(i); 
    } 
    } 

    public List<Pair<Integer, Integer>> getPairs() { 
    List<Integer> data = new ArrayList<>(); 
    data.addAll(list); 
    Collections.sort(data); 
    List<Pair<Integer, Integer>> pairs = new ArrayList<>(); 
    int last = data.get(data.size() - 1); 
    int s = -1; 
    int e; 
    for (int i = 0; i <= last; i++) { 
     if (list.contains(i)) { 
     if (s == -1) { 
      s = i; 
     } 
     e = i; 
     if (!list.contains(i + 1)) { 
      Pair<Integer, Integer> p = new Pair<>(s, e); 
      pairs.add(p); 
      s = -1; 
     } 
     } 
    } 
    return pairs; 
    } 

    public boolean haveGap(int start, int end) { 
    boolean b = false; 
    for (int i = start; i < end; i++) { 
     if (!list.contains(i)) { 
     b = true; 
     break; 
     } 
    } 
    return b; 
    } 
} 
public class Pair { 
    public final int first; 
    public final int second; 

    public Pair(int first, int second) { 
    this.first = first; 
    this.second = second; 
    } 

} 
public class ExampleUnitTest { 

    @Test public void gapSize() throws Exception { 
    GapAwareList gaps = fillGaps(); 

    gaps.put(0, 2); 
    gaps.put(0, 1); 
    gaps.put(3, 4); 
    gaps.put(6, 8); 
    List<Pair<Integer, Integer>> pairs = gaps.getPairs(); 

    assertEquals(3, pairs.size()); 
    } 

    @Test public void gapFirst() throws Exception { 
    GapAwareList gaps = fillGaps(); 

    gaps.put(0, 2); 
    gaps.put(0, 1); 
    gaps.put(3, 4); 
    gaps.put(6, 8); 
    List<Pair<Integer, Integer>> pairs = gaps.getPairs(); 

    assertTrue(pairs.get(0).first == 0); 
    assertTrue(pairs.get(0).second == 4); 
    } 

    @Test public void gapSecond() throws Exception { 
    GapAwareList gaps = fillGaps(); 
    List<Pair<Integer, Integer>> pairs = gaps.getPairs(); 

    assertTrue(pairs.get(1).first == 6); 
    assertTrue(pairs.get(1).second == 8); 
    } 

    private GapAwareList fillGaps() { 
    GapAwareList gaps = new GapAwareList(); 
    //add (0,2),(0,1),(3,4),(6,8) 
    gaps.put(0, 2); 
    gaps.put(3, 4); 
    gaps.put(0, 1); 
    gaps.put(6, 8); 
    gaps.put(13,11); 
    gaps.put(13, 13); 
    gaps.put(13, 14); 

    return gaps; 
    } 
    @Test public void checkGaps(){ 
    GapAwareList gaps = fillGaps(); 
    assertFalse(gaps.haveGap(0,4)); 
    assertFalse(gaps.haveGap(6, 8)); 
    assertFalse(gaps.haveGap(6, 7)); 
    assertTrue(gaps.haveGap(4, 6)); 
    } 
} 
+2

JAVA Generics не поддерживает примитивы. Если вы так хотите, вы можете создать явный массив. –

+0

Вы запрашиваете реализацию списка, которая запрещает пробелы или о дженериках? –

+0

@TimBiegeleisen о дженериках. например, HashMap - это, в основном, то же самое, что android SparseArray с diffenrece, что SparseArray ussed ints вместо целых чисел для ключей – Yarh

ответ

1

От Java documentation "Restrictions on Generics":

Невозможно создать универсальных типов с примитивными типами

Рассмотрим следующий параметризованный тип:

class Pair<K, V> { 

    private K key; 
    private V value; 

    public Pair(K key, V value) { 
     this.key = key; 
     this.value = value; 
    } 

    // ... 
} 

При создании Pair объекта, вы не можете заменить примитивный тип для параметра типа K или V:

Pair<int, char> p = new Pair<>(8, 'a'); // compile-time error 

Вы можете заменить только непримитивными типов для параметров типа K и V:

Pair<Integer, Character> p = new Pair<>(8, 'a'); 

Обратите внимание, что autoboxes компилятор Java 8 в Integer.valueOf(8) и 'a' до Character('a'):

Pair<Integer, Character> p = new Pair<>(Integer.valueOf(8), new Character('a')); 

Для получения дополнительной информации о Autoboxing см в уроке Numbers and StringsAutoboxing and Unboxing.

+0

Я знаю это, пожалуйста, посмотрите правую часть темы – Yarh

+0

Ну, если вы это знаете, тогда не используйте дженерики. –

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