java - 哪种方法更好地比较方法检查中的值或检查它是否存在于数组中?

标签 java arrays arraylist enums time-complexity

假设我有一个场景,当满足条件时需要完成某些很棒的任务。

public class Check101 {

public static boolean validColor(String color) {
    return color.equals("RED")
            || color.equals("BLUE")
            || color.equals("GREEN");
}
public static List<String> validColorList= new ArrayList<String>(Arrays.asList("RED","GREEN","BLUE"));

public static void main(String[] args) {
    String color = "RED";
    if (validColor(color)) {
        //do awesome work
    }
    if(validColorList.contains(color)){
        //do awesome work
    }
}

}

现在看起来不错,因为它只有原色, 如果有效颜色增加到 (i)100 和 (ii)1600 万种颜色会怎样? 那么哪种方法是最好的呢? 请注意,我受到限制,不能使用 Set/HashMap 或 O(1) 可搜索容器,并且被要求仅回答这个奇怪的场景。

最佳答案

当您使用List时,没有理由将通过Arrays.asList("RED","GREEN","BLUE")生成的列表复制到另一个ArrayList。您可以简单地声明它,例如

public static List<String> validColorList = Arrays.asList("RED","GREEN","BLUE");

当不允许使用Set时,两种方法都会执行线性搜索,这在性能方面同样很差。但列表方法更容易维护,因为添加另一个值只需要添加该值(到初始值设定项列表),而不是添加另一个 if 语句。

这可能会扩展到 100 个值,而即使线性搜索的性能缺陷也可能与 100 个值无关,只要您不经常执行查找,例如紧密循环。

但是,这两种方法都不能用于 16M 颜色。它甚至不是不切实际或具有灾难性的性能,它只是不可能。 Java 方法的最大代码大小为 65536 字节,这适用于持有 if 语句的普通方法或构造 List 的类初始值设定项。每个表达式或语句都需要几个字节,因此两种方法在达到几千个值的阈值时都会停止工作。即使将代码拆分为多个方法,单个类中可以定义的字符串常量的数量也少于 65535 个。

要管理大量值,您应该将名称列表作为资源嵌入到代码中,并使用类似的内容,例如

public static final List<String> validColorList;
static {
    try {
        validColorList = Files.readAllLines(
            Paths.get(MyClass.class.getResource("color-list").toURI()));
    } catch(IOException|URISyntaxException ex) {
        throw new ExceptionInInitializerError(ex);
    }
}

但是当我们进行此类更改时,没有理由对其他强烈建议的更改犹豫不决:

public static final Set<String> validColorList;
static {
    try {
        validColorList = new HashSet<>(Files.readAllLines(
            Paths.get(SO59045501.class.getResource("color-list").toURI())));
    } catch(IOException|URISyntaxException ex) {
        throw new ExceptionInInitializerError(ex);
    }
}

没有等效的链接 if 语句的方法。

关于java - 哪种方法更好地比较方法检查中的值或检查它是否存在于数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59045501/

相关文章:

python - Pandas pivot_table 包含空身份

c# - 使用数组 C# 复制文件的进度条

Java8 多参数流过滤

java - 如何将多个参数从 View 传递到 Controller 的方法

c - 解析json数组对象

java - JSF : Elements of ArrayList are not rendered properly?

java - 对自定义对象的 ArrayList 进行排序并在 Java 中重新排序

java - 并行使用 ArrayList

java - 要求输入整数,如果是 q 则退出,但如果有其他字母则重试

java - 如何使用 Maven 从我指定的目录的内容生成 JAR 文件?