2017-01-10 12 views
1

Если у меня есть ColA, ColB, Colc, ColD и есть 1000 строк в каждом столбце в TAdvStringGrid. Я бы хотел проверить количество двойных измерений значений в 1000 строках в colA, ColB, Colc, ColD из TAdvStringGrid.Как сравнить 4 значения столбца TAdvStringGrid друг с другом и пометить их?

Я делаю некоторые вещи, как при первом считывании значений ColA, ColB, ColC, ColD в многомерном массиве и циклизации каждого элемента в многомерном массиве и сравнении с каждым элементом строки TAdvStringGrid, и когда он найден с использованием функции OnDrawcell, я помечен и отображение строки с цветом. Однако для этого требуется много времени. Есть ли более короткий способ сделать это. По мере того, как строки продолжают расти. Спасибо за ответ заранее.


Каждая строка представляет собой одно измерение, а одно измерение состоит из 4 значений в ColA, B, C, D.

List : array of array of double; 
SetLength (List,AdvStringGrid.RowCount,4);  
for i := 0 to AdvStringGrid.RowCount -1 do begin 
    j:=0; 
    List[i,j] := strtofloat(AdvStringGrid.Cells[4,i+1]); 
    List[i,j+1] := strtofloat(AdvStringGrid.Cells[5,i+1]); 
    List[i,j+2] := strtofloat(AdvStringGrid.Cells[8,i+1]); 
    List[i,j+3] := strtofloat(AdvStringGrid.Cells[9,i+1]); 
end;{for i} 

Как сравнить каждый элемент с соседом и пометить дубликат?

ответ

1

Я исправлю, что каждая строка является одной мерацией? Итак, одна мерация состоит из 4 значений?

Прежде всего, вы не должны изменять визуальный StringGrid в цикле. В худшем случае StringGrid делает недействительным и рисует снова после каждого действия. Так что хорошо читать все данные в многомерном массиве.

Чтобы устранить двойники, я бы отсортировал все, а затем сравнил neigbors. Это довольно распространенная картина.

Определите любой заказ, например, ColA accending, затем ColB accending, ColC accending и ColD, сгенерируйте и импровизируйте алгоритм сортировки (например, quicksort или mergesort).

После того, как все сортируется, вы можете пересечь массив из элемента highes в 0 и проверить, совпадают ли два соседа.

Если вы хотите пометить двойные значения вместо их удаления, рассмотрите возможность добавления 5-го столбца для значения, когда оно является дубликатом.

После всех калибровок я бы искал любую функцию, например BeginUpdate() и Endupdate(), чтобы убедиться, что StringGrid будет рисовать только один раз.

ли все изменения в StringGrid между вызовом BeginUpdate() и Endupdate()

Update: ваш код может выглядеть примерно так:

var 
i:integer; 
sortedList: array of array of double; 
begin 
setlength(List, 1000, 5); // use a fifth row for marking doublicates, set this value to 0 
// Fill List like you mentioned here 
sortedList = YourSortAlgorithm(List); // sort your List here 
for i := high(sortedList) downto 0 do 
    begin 
    // compare if entries are duplicates 
    if sortedList[i,1] = sortedList[i-1,1] and sortedList[i,2] = sortedList[i-1,2] and sortedList[i,3] = sortedList[i-1,3] and sortedList[i,4] = sortedList[i-1,4] then 
     begin 
     sortedList[i-1,5] = 1; // 1 means duplicate, 0 means not duplicate 
     end; 
    end; 
AdvStringGrid1.BeginUpdate; 
// update your Stringgrid here 
AdvStringGrid1.EndUpdate(); 
end; 

Bye Кстати, вместо того, чтобы использовать два dimentionaly массива я бы рекомендовал использовать массив записей. Сказать, например, что ваш КОЛА является высота, ColB является длина, ColC является температура и ColD является возраст можно определить запись как этот

type 
TMeasurement = record 
    height: double; 
    length: double; 
    temperature: double; 
    age: double; 
    isBoolean: boolean; 
end; 

var 
    list: array of TMeasurement; 
begin 
//... 
end; 
+0

да вы правильно, Каждая строка является измерение и одно измерение состоит из 4 значений в ColA, B, C, D. Список: массив из массива double; SetLength (List, AdvStringGrid.RowCount, 4); для i: = 0 в AdvStringGrid.RowCount -1 do начало j: = 0; Список [i, j]: = strtofloat (AdvStringGrid.Cells [4, i + 1]); Список [i, j + 1]: = strtofloat (AdvStringGrid.Cells [5, i + 1]); Список [i, j + 2]: = strtofloat (AdvStringGrid.Cells [8, i + 1]); Список [i, j + 3]: = strtofloat (AdvStringGrid.Cells [9, i + 1]); конец; {for i} Как сравнить каждый элемент с соседом и пометить дубликат? – mdel

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

  • Нет связанных вопросов^_^