ReverseMapping

Difference between revision 2 and current revision

Summary: {{{ awk # reverse mapping of keys -> values in given array function reverse_mapping(array, tmp_key, tmp_element, done) { # user . . .

No diff available.

# reverse mapping of keys -> values in given array
function reverse_mapping(array,        tmp_key, tmp_element, done) {
    # user shouldn't have passed these, but let's be safe
    tmp_key = tmp_element = ""
    for (key in done)
        delete done[key]

    for (key in array) {
        # if we already reversed this pair to avoid a collision, continue
        if (key in done)
            continue

        # if this swap would cause a colision, store those values
        if (array[key] in array) {
            tmp_key     = array[    key]
            tmp_element = array[tmp_key]
        }

        # reverse the mapping of our current key -> element pair
        array[array[key]] = key

        # delete the now old mapping
        delete array[key]

        # if we had a collision, reverse those values, too
        if (tmp_key) {
            array[tmp_element] = tmp_key
            done [tmp_key    ]
            tmp_key = ""
        }
    }
}

# example
BEGIN {
    a["b"] = 1
    a[1] = "a"
    a[2] = "b"
    a[3] = "c"

    for (k in a)
        printf("a[%s] = %s\n", k, a[k])

    reverse_mapping(a)

    printf("\n")
    for (k in a)
        printf("a[%s] = %s\n", k, a[k])
}

The example shown prints:

a[b] = 1
a[1] = a
a[2] = b
a[3] = c

a[a] = 1
a[b] = 2
a[c] = 3
a[1] = b