Сортировка по определенному столбцу
Все еще пишу программу 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 переменная, которая получена из флага при старте программы
}
Но меня не отпускает чувство, что можно сделать все как то проще и лучше. Подскажите пожалуйста как такое еще можно решить?