Выборка из массива в Android kotlin

#android #kotlin #sample

#Android #kotlin #образец

Вопрос:

Мне нужна идея, как это сделать. Я не силен в математике. Возможно, у него есть встроенная функция, которую я еще не нашел.

У меня есть массив, который состоит из 2048 данных. Мне нужно получить из этого значение 250.

Я думаю о

 2048/250 = 8.19
  

это означает, что я принимаю значение при каждом приращении 8 позиции в массиве.

Есть ли функция для этого?

Комментарии:

1. Вам нужна выборка, так почему бы не поискать статистическую библиотеку или что-то в этом роде? Может быть, если это 1 раз, это перебор

2. Если вы берете несколько фиксированных элементов, почему бы не взять первые 250?

3. @al3c поскольку это не будет выборка, она будет предвзятой

4. Я добавляю другой способ сделать это

5. @cutiko выбор предварительно фиксированного набора индексов одинаково смещен, независимо от того, какие индексы вы выбираете. Обычно выбираются случайные индексы.

Ответ №1:

Насколько мне известно, я не думаю, что проблема заключается в том, чтобы сбалансировать итерации и случайность выборки.

Итак, наивный подход

 dataSet.indexedMapNotNull { i, data ->
    if (i % 8 == 0) data else null
}
  

Это будет проходить через весь массив, поэтому вам нужно всего 250 итераций, а не dataSet.size итераций. Так что, если мы повторим 250 раз, и для каждого из них мы берем 8-й раз

 val sample = mutableListOf<DataType>()
for (i in 1..250) {
    val positionInDataSet = (i * 8) - 1 //minus one adjust the index for the size
    val case = dataSet[positionInDataSet]
    sample.add(case)
}

  

Другой альтернативой было бы просто использовать методы копирования из коллекций, но проблема в том, что вы теряете выборку

 dataSet.subArray(0, 250)
  

Подмассив не произвел выборку данных псевдослучайным способом, а получил только первые 250, и это было бы предвзято. Преимущество обычно заключается в том, что методы копирования массива представляют собой журнал N.

Другим вариантом было бы еще больше рандомизировать вещи, получая данные не каждые 8, а случайную позицию, пока мы не достигнем желаемого размера выборки.

 val sample = mutableSetOf<DataType>()

while (sample.size != 250) {
    val randomPosition = Random.nextInt(0, dataSet.size)
    val randomSelection = dataSet[randomPosition]
    sample.add(randomeSelection)

}
  

Здесь мы используем набор, потому Set что гарантируем уникальные элементы, поэтому у вас есть совершенно случайные 250 элементов из вашего набора данных. Проблема в том, что случайность в позиции может повторяться randomPosition более одного раза, поэтому вы выполняете итерацию по набору данных более 250 раз, это может быть даже факториальным, что в больших наборах данных может произойти и считается самой низкой производительностью.

Комментарии:

1. Спасибо. Я попробую ваше предложение. Сначала нужно понять, что ты говоришь 🙂

2. Вам нужно получить 250 значений из набора данных, эти значения должны быть получены из всего набора данных, а не только от 0 до 250, поэтому мы определяем случайный способ сделать это, в данном случае, если каждый 8, потому что это 2048 делится на 250. Итак, вместо того, чтобы каждый раз повторять набор данных и получать эти данные, если это позиция, кратная 8, мы выполняем итерацию только 250 раз, что нам нужно.

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