Сортировка по слову

Как в golang сделать сортировку строк по определенному слову строке? Например чтобы набор строк

some text in string
some second text in string
some third text in string

сортировался по второму слову (text, second, third) соответственно и такой набор строк при сортировке по второму слову выдаст результат

some second text in string
some text in string
third text in string

Я написал только алгоритм который:

  • разбивает набор строк на массивы в которых значение это целая строка,
  • значения этих массивов разбивает на подмассивы в которых значение это слова
  • в каждом подмассиве массива берется слово по целевому индексу, меняется местами с нулевым индексом,
  • получившиеся массивы в которых значения это строки с измененным порядком слов, сортируются с помощью sort.Slice(),
  • отсортированные массивы снова разбиваются на подмассивы в которых значения это слова в неправильном порядке,
  • слово по нулевому индексу которое ранее было переставлено с целевого индекса, меняется местами с целевым индексом и таким образом возвращается нормальный порядок слов.
  • формируется новая строка в которую конкатенируются отсортированные массивы.

Но с таким подходом работает не на всех наборах строк. Чаще возникает out of range, хотя я все обработал уже что можно было.

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


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

Автор решения: Антон

Простой пример если я правильно понял

package main

import (
    "fmt"
    "sort"
    "strings"
)

type sortStrByName []string

func (s sortStrByName) Len() int { return len(s) }
func (s sortStrByName) Less(i, j int) bool {
    return strings.Split(s[i], " ")[3] < strings.Split(s[j], " ")[3]
}
func (s sortStrByName) Swap(i, j int) { s[i], s[j] = s[j], s[i] }

func main() {
    p := sortStrByName{
        "His name is Jake",
        "Her name is Alice",
        "His name is Dwane",
        "Her name is Felista",
        "His name is Bob",
    }
    sort.Sort(sortStrByName(p))
    for _, v := range p {
        fmt.Println(v)
    }

    s := []string{
        "some useless text in string",
        "some text in string",
        "third text in string",
        "some second text in string",
    }
// Сортировка по второму слову 
    sort.Slice(s, func(i, j int) bool { return strings.Split(s[i], " ")[1] < strings.Split(s[j], " ")[1] })
    for _, v := range s {
        fmt.Println(v)
    }
}
→ Ссылка