Я создал программу для создания текстовой гистограммы из изображения.
Теперь мне нужно взять данные из текстового файла и найти наибольшее значение с наибольшим количеством счетчиков и наименьшее значение с наибольшим количеством счетчиков.
Это пример из сгенерированного текстового файла:
0 1
1000 80
10004 2
10005 200
10006 2
1002 73
105 10
Слева я перечислил значения пикселей, а с другой стороны количество.
Итак, здесь я получаю значение 10005 как наибольшее с наибольшим количеством (200) и значение 1000 как наименьшее с наибольшим числом (80).
Я знаю, как читать текстовый файл построчно, разделять значения и помещать их в массив.
Вопрос в том, как я могу получить то, что хочу, самым быстрым способом, предполагая, что я работаю с большими изображениями, генерирующими длинные списки значений (сотни) в текстовых файлах гистограммы?
Вы правы, спасибо! Я был больше сосредоточен на вопросе, чем на списке, когда писал его.





Определение минимального и максимального значения здесь несколько противоречиво, но, следуя описанию, основная логика может заключаться в том, что минимум может быть определен, когда найден максимум.
Таким образом, мы можем упорядочить список (несколько сотен строк данных — это немного) по убыванию (сначала более высокие значения), оценить максимальное значение и после этого определить минимальное:
Dim bitmapData = File.ReadAllLines("[Data File Path]").
Select(Function(bd) bd.Split(New String() {" "c}, StringSplitOptions.RemoveEmptyEntries).
Select(Function(n) Integer.Parse(n)).ToArray()).
OrderByDescending(Function(value) value(0)).ToList()
Dim max() As Integer = bitmapData(0)
Dim min() As Integer = {bitmapData(0)(0), 0}
For i As Integer = 1 To bitmapData.Count - 1
If bitmapData(i)(1) > max(1) Then
If bitmapData(i + 1)(0) < bitmapData(i)(0) Then
max = bitmapData(i)
End If
ElseIf bitmapData(i)(0) < max(0) Then
If bitmapData(i)(1) >= min(1) Then
min = bitmapData(i)
End If
End If
Next
Используя вашу выборку данных и сравнительный массив значений, вы получите следующие результаты:
Min ( 1030, 251) Min ( 1000, 80)
Max (10001, 260) Max (10005, 200)
--------------------------------------------
0 1 0 1
10001 260 1000 80
1000 80 10004 2
10004 2 10005 200
10005 200 10006 2
10006 2 1002 73
1002 73 105 10
105 10
50 250
51 220
1026 201
1030 251
1031 250
10009 252
10008 250
10007 251
Предполагая, что источник данных представлен двумя разными массивами (с именами Pixels и Counts, здесь), которые должны быть синхронизированный (парные индексированные значения), вам просто нужно заменить массив BitmapData массивом Pixels и Counts:
Dim Pixels As Integer() = [Integer Source]
Dim Counts As Integer() = [Integer Source]
Dim max() As Integer = {Pixels(0), Counts(0)}
Dim min() As Integer = {Pixels(0), 0}
For i As Integer = 1 To Pixels.Count - 1
If Counts(i) > max(1) Then
If Pixels(i + 1) < Pixels(i) Then
max = {Pixels(i), Counts(i)}
End If
ElseIf Pixels(i) < max(0) Then
If Counts(i) >= min(1) Then
min = {Pixels(i), Counts(i)}
End If
End If
Next
Спасибо, это работает! и как я могу сделать то же самое, но взять значения из двух целочисленных массивов, один из которых содержит значения пикселей, а другой - счетчики? не читает текстовый файл.
Это не работает для меня. У меня есть массив пикселей и парные значения массива. Например: Counts(0) соответствует Pixels(0) и т. д., но в первом коде, который вы разместили, вы использовали функцию OrderByDescending, и ее здесь не существует, и когда я читаю максимальное значение, она выдает мне " 0», потому что это первое число в массиве пикселей (индекс 0), и оно не по порядку. Я уже объявлял эти массивы, и я не понимаю, почему вы ставите [Integer Source] в объявлении, у меня выдает ошибку, плюс я должен изменить bitmapData.Count на Pixels.Count в цикле.
Dim Pixels As Integer() = [Integer Source] означает, что массив Pixels заполнен любым источником, который вы используете. То же самое для массива Count. Если у вас уже есть массив Pixels (с любым именем), используйте его. bitmapData бесполезен, если у вас уже есть 2 массива. Используйте только второй фрагмент кода, где вы предоставляете массивы Pixels и Count. Порядок здесь не имеет значения.
Почему 1000 (80) не является самым маленьким из самых высоких?