Сортировка по определенному столбцу

Все еще пишу программу sort. Должен быть ключ -k который позволяет задать для сортировки определенный столбец(слово в строке). Я смог придумать сам такой алгоритм

// функция меняет местами значения по индексам a и b
func swap(strs []string, a, b int) []string {
    tmp := strs[a]
    strs[a] = strs[b]
    strs[b] = tmp
    return strs
}

// переносит слова из строки на определенный индекс и создает новую строку с учетом переноса.
func SwapAndConcatenate(splited []string, a, b int) string {
    var spl []string
    newstr := ""
    for i := 0; i < len(splited); i++ {
        spl = splitContent(splited[i], " ")
        if b < len(spl) {
            // меняет местами значение по индексу b со значением по индексу a
            spl = swap(spl, a, b)
        }
        // из получившегося массива делает строку.
        for j := 0; j < len(spl); j++ {
            if j == len(spl)-1 {
                newstr += spl[j] + "\n"
                break
            } else {
                newstr += spl[j] + " "
            }
        }
    }
    return newstr
}

func sortByColumn(column int) {
    content := getContent()
    splited := splitContent(content, "\n")
    // меняет местами значение по нулевому индексу с тем по которому нужно сортировать и создает строку.
    newstr := SwapAndConcatenate(splited, 0, column)
    // разбивает строку на массивы по переносу строки
    strs := splitContent(newstr, "\n")
    // делает обычную сотрировку по измененной строке
    sort.Slice(strs, func(i, j int) bool {
        return strings.ToLower(strs[i]) < strings.ToLower(strs[j])
    })
    //  то значение по которму нужно сортировать возвращается с нулевого индекса на прежнее место и делается строка из получившихся массивов
    newstr = SwapAndConcatenate(strs, 0, column)
    // вывод строки
    fmt.Println(newstr)
}
//читает файл со строками
func getContent() string {
    content, err := ioutil.ReadFile(path)
    if err != nil {
        log.Fatal(err)
    }
    return string(content)
}

//делает разделение строк на массивы по определенному символу который передается при вызове
func splitContent(content, separator string) (splited []string) {
    splited = strings.Split(content, separator)
    return
}

func main() {
    sortByColumn(setColumn) //setColumn глобальная int переменная, которая получена из флага при старте программы
}

Но меня не отпускает чувство, что можно сделать все как то проще и лучше. Подскажите пожалуйста как такое еще можно решить?


Ответы (0 шт):