2015-05-23 2 views
1

Используя Java, я хочу разбить массив int s на массив диапазонов. Например, массивРазбитый массив Java в диапазоны

[1, 2, 3, 4, 5, 6, 7, 8, 100, 101, 102, 103] 

вернется

[Range(1, 8), Range(100, 103)] 

, потому что он состоит из 1 до 8 и от 100 до 103

Было бы лучше, если бы библиотека, но любой вид метод этого преобразования в порядке.

+1

где '2' из старого массива ??? если вам нужны случайные элементы из вашего массива, тогда вы должны написать свой собственный метод. – Prashant

+0

Я не ответил на ваш вопрос. и как вы уверены, что у меня есть downvote ???? – Prashant

ответ

2

Ok Джеймс, вот ваш рабочий раствор :)

private void executeTestCode(){ 
    int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 100, 101, 102, 103};  
    Range[] ranges = Arrays.stream(getRanges(arr)).filter(r -> r != null).toArray(Range[]::new);   
    String output = Arrays.stream(ranges) 
      .map(Range::toString) 
      .reduce("[", (dynamicString, stringedRange) -> (dynamicString + stringedRange + ", ")); 
    output = output.substring(0, output.length()-2) + "]"; 
    System.out.println(output); 
} 

ВЫВОД:
[Диапазон (1, 8), Range (100, 103)]

private Range[] getRanges(int[] toBeProcessed){ 
    Range[] result = new Range[toBeProcessed.length]; //larger array won't be needed 
    int startRange = toBeProcessed[0]; 
    int ranges = 0; 
    for(int a=0; a<toBeProcessed.length; a++){ 
     try{ 
      if(toBeProcessed[a] + 1 != toBeProcessed[a+1]){     
       result[ranges] = new Range(startRange, toBeProcessed[a]); 
       startRange = toBeProcessed[a+1]; 
       ranges++; 
      }     
     }catch(ArrayIndexOutOfBoundsException e){ 
      result[ranges] = new Range(startRange, toBeProcessed[toBeProcessed.length-1]); 
     } 
    } 
    return result;  
} 



CLASS Диапазон:

class Range{ 
    private int start, end; 
    public Range(int st, int en){ 
     start = st; 
     end = en; 
    } 

    @Override 
    public String toString(){ 
     return "Range(" +start+ ", " +end+ ")"; 
    } 
} 
+1

Я бы дал это upvote, но это почти наверняка вопрос о домашнем задании. :-) Для вещей, которые выглядят как домашнее задание, он (иногда) предпочитает давать подсказки, а не полный ответ. Тем не менее, хороший код. –

+0

Это не домашнее задание. Это анализ кода A858. – HyperNeutrino

+0

Работает отлично. Большое спасибо. – HyperNeutrino

1

Вы можете использовать

Arrays.copyOfRange(yourArray, inclusiveStartIndex, exclusiveEndIndex); 

Он возвращает новый массив.

+0

Не то, что я хочу, но спасибо anyways – HyperNeutrino

+0

Почему это не то, что вы хотите? Это похоже на то, что вы просили здесь, поэтому сложно предложить что-то еще, пока люди не узнают, почему это не работает. :) –

+0

Более конкретно, массивы в Java неизменяемы; они не могут быть изменены после их создания. (Значения в них могут, но сам массив, включая его длину, является постоянным.) Невозможно разделить массивы, не выполняя, по крайней мере, мелкую копию примитивов, хранящихся в них. (Если ваши значения были целыми, а не int, то мелкая копия могла бы использовать существующие объекты.) –

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