Java、Go、Ts和Js分别实现SKU算法

SKU(Stock Keeping Unit,库存量单位)算法是一种常用于电商网站的商品规格选择算法,它可以根据不同属性的组合生成唯一的SKU编码。下面分别介绍Java、TypeScript和JavaScript实现SKU算法的方法。

Java实现SKU算法:

import java.util.ArrayList;
import java.util.List;

public class SkuUtil {
    /**
     * 根据SKU属性列表生成所有可能的SKU编码
     *
     * @param skuProperties SKU属性列表,每个元素表示一个属性及其可选值
     * @return 所有可能的SKU编码列表
     */
    public static List<String> generateSku(List<List<String>> skuProperties) {
        List<String> skuList = new ArrayList<>();
        if (skuProperties != null && skuProperties.size() > 0) {
            // 初始化第一个属性的所有可选值
            List<String> firstPropertyValues = skuProperties.get(0);
            for (String value : firstPropertyValues) {
                skuList.add(value);
            }
            // 逐个处理后续属性
            for (int i = 1; i < skuProperties.size(); i++) {
                List<String> propertyValues = skuProperties.get(i);
                List<String> tempList = new ArrayList<>();
                for (String sku : skuList) {
                    for (String value : propertyValues) {
                        tempList.add(sku + "-" + value);
                    }
                }
                skuList = tempList;
            }
        }
        return skuList;
    }
}

使用示例:

List<List<String>> skuProperties = new ArrayList<>();
skuProperties.add(Arrays.asList("颜色", "红色", "蓝色", "绿色"));
skuProperties.add(Arrays.asList("尺寸", "S", "M", "L"));
List<String> skuList = SkuUtil.generateSku(skuProperties);
System.out.println(skuList);

输出结果:

[颜色-红色-尺寸-S, 颜色-红色-尺寸-M, 颜色-红色-尺寸-L, 颜色-蓝色-尺寸-S, 颜色-蓝色-尺寸-M, 颜色-蓝色-尺寸-L, 颜色-绿色-尺寸-S, 颜色-绿色-尺寸-M, 颜色-绿色-尺寸-L]

Go 语言实现 SKU 算法:

package main

import (
	"fmt"
	"strings"
)

func GenerateSku(skuProperties [][]string) []string {
	var skuList []string
	if len(skuProperties) > 0 {
		// 初始化第一个属性的所有可选值
		firstPropertyValues := skuProperties[0]
		for _, value := range firstPropertyValues {
			skuList = append(skuList, value)
		}
		// 逐个处理后续属性
		for i := 1; i < len(skuProperties); i++ {
			propertyValues := skuProperties[i]
			tempList := make([]string, 0)
			for _, sku := range skuList {
				for _, value := range propertyValues {
					tempList = append(tempList, fmt.Sprintf("%s-%s", sku, value))
				}
			}
			skuList = tempList
		}
	}
	return skuList
}

func main() {
	skuProperties := [][]string{
		{"颜色", "红色", "蓝色", "绿色"},
		{"尺寸", "S", "M", "L"},
	}
	skuList := GenerateSku(skuProperties)
	fmt.Println(strings.Join(skuList, ", "))
}

使用示例:

$ go run sku.go
颜色-红色-尺寸-S, 颜色-红色-尺寸-M, 颜色-红色-尺寸-L, 颜色-蓝色-尺寸-S, 颜色-蓝色-尺寸-M, 颜色-蓝色-尺寸-L, 颜色-绿色-尺寸-S, 颜色-绿色-尺寸-M, 颜色-绿色-尺寸-L

在这个示例中,我们定义了一个 GenerateSku 函数,接收一个 SKU 属性列表(每个元素表示一个属性及其可选值),并返回所有可能的 SKU 编码列表。函数内部使用了和其他语言类似的算法实现,逐个处理 SKU 属性列表中的属性,生成对应的 SKU 编码列表。

注意,在 Go 语言中,变量声明需要先定义类型,然后再通过 :=var 关键字进行初始化。另外,使用 append 函数往切片中添加元素时,需要使用 ... 进行解包操作。

TypeScript实现SKU算法:

function generateSku(skuProperties: string[][]) {
    let skuList: string[] = [];
    if (skuProperties && skuProperties.length > 0) {
        // 初始化第一个属性的所有可选值
        let firstPropertyValues = skuProperties[0];
        for (let value of firstPropertyValues) {
            skuList.push(value);
        }
        // 逐个处理后续属性
        for (let i = 1; i < skuProperties.length; i++) {
            let propertyValues = skuProperties[i];
            let tempList: string[] = [];
            for (let sku of skuList) {
                for (let value of propertyValues) {
                    tempList.push(`${sku}-${value}`);
                }
            }
            skuList = tempList;
        }
    }
    return skuList;
}

使用示例:

let skuProperties: string[][] = [
    ["颜色", "红色", "蓝色", "绿色"],
    ["尺寸", "S", "M", "L"]
];
let skuList = generateSku(skuProperties);
console.log(skuList);

输出结果:

["颜色-红色-尺寸-S", "颜色-红色-尺寸-M", "颜色-红色-尺寸-L", "颜色-蓝色-尺寸-S", "颜色-蓝色-尺寸-M", "颜色-蓝色-尺寸-L", "颜色-绿色-尺寸-S", "颜色-绿色-尺寸-M", "颜色-绿色-尺寸-L"]

JavaScript实现SKU算法:

function generateSku(skuProperties) {
    let skuList = [];
    if (skuProperties && skuProperties.length > 0) {
        // 初始化第一个属性的所有可选值
        let firstPropertyValues = skuProperties[0];
        for (let value of firstPropertyValues) {
            skuList.push(value);
        }
        // 逐个处理后续属性
        for (let i = 1; i < skuProperties.length; i++) {
            let propertyValues = skuProperties[i];
            let tempList = [];
            for (let sku of skuList) {
                for (let value of propertyValues) {
                    tempList.push(`${sku}-${value}`);
                }
            }
            skuList = tempList;
        }
    }
    return skuList;
}

使用示例:

let skuProperties = [
    ["颜色", "红色", "蓝色", "绿色"],
    ["尺寸", "S", "M", "L"]
];
let skuList = generateSku(skuProperties);
console.log(skuList);

输出结果:

["颜色-红色-尺寸-S", "颜色-红色-尺寸-M", "颜色-红色-尺寸-L", "颜色-蓝色-尺寸-S", "颜色-蓝色-尺寸-M", "颜色-蓝色-尺寸-L", "颜色-绿色-尺寸-S", "颜色-绿色-尺寸-M", "颜色-绿色-尺寸-L"]