95 lines
2.5 KiB
Fortran
95 lines
2.5 KiB
Fortran
module assoc_array_mod
|
|
implicit none
|
|
private
|
|
public :: KeyValue, merge_assoc_arrays
|
|
|
|
! Derived type for key-value pairs
|
|
type :: KeyValue
|
|
character(len=:), allocatable :: key
|
|
character(len=:), allocatable :: value
|
|
end type KeyValue
|
|
|
|
contains
|
|
|
|
! Function to merge two associative arrays
|
|
function merge_assoc_arrays(base, update) result(merged)
|
|
type(KeyValue), intent(in) :: base(:), update(:)
|
|
type(KeyValue), allocatable :: merged(:)
|
|
type(KeyValue), allocatable :: temp(:)
|
|
integer :: base_size, update_size, i, j, k, merged_size
|
|
logical :: key_exists
|
|
|
|
base_size = size(base)
|
|
update_size = size(update)
|
|
|
|
! Allocate temporary array to hold all possible keys (worst case: no overlap)
|
|
allocate(temp(base_size + update_size))
|
|
merged_size = 0
|
|
|
|
! Add all keys from update array (update takes precedence)
|
|
do i = 1, update_size
|
|
merged_size = merged_size + 1
|
|
temp(merged_size)%key = update(i)%key
|
|
temp(merged_size)%value = update(i)%value
|
|
end do
|
|
|
|
! Add keys from base array that are not in update
|
|
do i = 1, base_size
|
|
key_exists = .false.
|
|
do j = 1, update_size
|
|
if (base(i)%key == update(j)%key) then
|
|
key_exists = .true.
|
|
exit
|
|
end if
|
|
end do
|
|
if (.not. key_exists) then
|
|
merged_size = merged_size + 1
|
|
temp(merged_size)%key = base(i)%key
|
|
temp(merged_size)%value = base(i)%value
|
|
end if
|
|
end do
|
|
|
|
! Allocate merged array with exact size
|
|
allocate(merged(merged_size))
|
|
do i = 1, merged_size
|
|
merged(i)%key = temp(i)%key
|
|
merged(i)%value = temp(i)%value
|
|
end do
|
|
|
|
! Clean up temporary array
|
|
deallocate(temp)
|
|
end function merge_assoc_arrays
|
|
|
|
end module assoc_array_mod
|
|
|
|
program main
|
|
use assoc_array_mod
|
|
implicit none
|
|
type(KeyValue), allocatable :: base(:), update(:), merged(:)
|
|
integer :: i
|
|
|
|
! Initialize base associative array
|
|
allocate(base(3))
|
|
base(1) = KeyValue("name", "Rocket Skates")
|
|
base(2) = KeyValue("price", "12.75")
|
|
base(3) = KeyValue("color", "yellow")
|
|
|
|
! Initialize update associative array
|
|
allocate(update(3))
|
|
update(1) = KeyValue("price", "15.25")
|
|
update(2) = KeyValue("color", "red")
|
|
update(3) = KeyValue("year", "1974")
|
|
|
|
! Merge the arrays
|
|
merged = merge_assoc_arrays(base, update)
|
|
|
|
! Print the merged array
|
|
print *, "Merged associative array:"
|
|
do i = 1, size(merged)
|
|
print *, "Key: ", merged(i)%key, ", Value: ", merged(i)%value
|
|
end do
|
|
|
|
! Clean up
|
|
deallocate(base, update, merged)
|
|
end program main
|