golang 二维数组 / 切片排序

本贴最后更新于 1860 天前,其中的信息可能已经时过境迁

二维数组/切片排序

前言

最近在做接口自动化的时候,碰到二维数组排序问题,java 中用的 stream 的 sorted 方法,可以实现指定字段排序(先根据第一个字段,如果第一个字段相同,再根据第二个字段,以此类推),但是最近在学 golang,就想着把项目用 go 重新实现,到这里有点卡住了,没找到现有的方法,就自己用 go 的 sort 接口重新写了下,写此篇备忘。

实现

初版

java 版

// 最初java中是用Comparator接口自己写的实现,后来不止怎么地,可能想试试新特性,就用的stream的sorted
// 有点搓,凑合理解,就是挨个比第一,第二,第三个字段,进行排序
public class HollTest {

    public static List sortList (List list) {
        List<List<String>> stream = (List<List<String>>) list.stream().sorted(Comparator.comparing(HollTest::comparingOne).thenComparing(HollTest::comparingTwo).thenComparing(HollTest::comparingThree))
                .collect(Collectors.toList());
        return stream;
    }

    private static String comparingOne(List<String> mylist){
        return mylist.get(0);
    }

    private static String comparingTwo(List<String> mylist){
        return mylist.get(1);
    }
    private static String comparingThree(List<String> mylist){
        return mylist.get(mylist.size() - 1);
    }
}

golang 版

// 最开始准备自己定义方法,后来一想,有现成的sort接口,为啥不用,就实现了下sort接口
package main

import (
	"fmt"
	"sort"
)

type myvalue2 [][]string

func (p myvalue2) Len() int {
	return len(p)
}

// 沿袭java当时的实现思路,挨个字段比,忽然发现怎么这么别扭,就出现了第二版
func (p myvalue2) Less(i, j int) bool {
	if p[i][0] > p[j][0] {
		return true
	} else if p[i][0] == p[j][0] && len(p[i]) > 0 {
		if p[i][1] > p[j][1] {
			return true
		} else if p[i][1] > p[j][1] && len(p[i]) > 1 {
			if p[i][2] > p[j][2] {
				return true
			} else {
				return false
			}
		} else {
			return false
		}
	} else {
		return false
	}
}

func (p myvalue2) Swap(i, j int) {
	p[i], p[j] = p[j], p[i]
}

func main() {
	var m myvalue2
	m = [][]string{
		{"a", "a", "g", "c", "z", "d"},
		{"a", "c", "g", "v", "z", "d"},
		{"r", "a", "g", "c", "z", "a"},
		{"a", "a", "g", "b", "a", "v"},
		{"a", "a", "g", "b", "a", "a"},
		{"a", "a", "g", "b", "z", "a"},
	}
	sort.Sort(m)
	fmt.Println(m)
}

第二版

package main

import (
	"fmt"
	"sort"
)

//type myvalue []string

type myvalue2 [][]string

func (p myvalue2) Len() int {
	return len(p)
}

// 想了想能用循环,实现所有字段比对一次,更精确点,免得二维数组的元素前面n个元素都是一样的
func (p myvalue2) Less(i, j int) bool {
	for k := 0; k < len(p[i]); k++ {
		if p[i][k] > p[j][k] {
			return true
		} else if p[i][k] == p[j][k] {
			continue
		} else {
			return false
		}
	}
	return true
}

func (p myvalue2) Swap(i, j int) {
	p[i], p[j] = p[j], p[i]
}

func main() {
	var m myvalue2
	m = [][]string{
		{"a", "a", "g", "c", "z", "d"},
		{"a", "c", "g", "v", "z", "d"},
		{"r", "a", "g", "c", "z", "a"},
		{"a", "a", "g", "b", "a", "v"},
		{"a", "a", "g", "b", "a", "a"},
		{"a", "a", "g", "b", "z", "a"},
	}
	sort.Sort(m)
	fmt.Println(m)
}

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 375 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...