【问题标题】:Is it possible to check hundreds of string arrays by invoking their string names in a for loop?是否可以通过在 for 循环中调用它们的字符串名称来检查数百个字符串数组?
【发布时间】:2020-12-12 06:09:25
【问题描述】:
public class MaryPoppinsBagandWeasleyTent {
    public static void main(String[] args) {
        String[] darkorange = {"3darkchartreuse"};
        String[] stripedfuchsia = {"5stripedlavender"};
        String[] dullgray = {"4mutedcyan", "3lightmaroon"};
        String[] dullchartreuse = {"3lighttan", "3dottedbronze"};
        //etc for hundreds of lines
        String[] names = {"darkorange", "stripedfuchsia",
                "dullgray", "dullchartreuse"}; //etc for hundreds of lines
        String directs = "";
        for (int i = 0; i < names.length; i++) {
            if (names[i].contains("shinygold")) {
                System.out.println(names[i]);
                directs += (names[i] + ",");
            }
        }
    }
}

如上所示,字符串数组的列表非常长。我有所有字符串数组的所有名称的相应字符串数组。是否可以在 for 循环中调用这些字符串数组中的每一个?这就是我试图用names[I] 做的事情,但它只调用STRING names[i],而不是String[] 的名称names[I]

你可能讨厌过长的数组列表,但我可能很快就会学会更好的方法。

是否可以通过在 for 循环中调用字符串名称来检查数百个字符串数组?

【问题讨论】:

    标签: java arrays string


    【解决方案1】:

    tl;博士

    为了更好地管理编译时已知的此类不可变数据,请为每个颜色组创建一个枚举,其中包含颜色名称的集合或列表。

    enum ColorGroup
    {
        DARK_ORANGE( List.of( "3darkchartreuse" ) ),
        DULL_GRAY( List.of( "4mutedcyan" , "3lightmaroon" ) );
    
        private List < String > colors;
    
        // Constructor
        ColorGroup ( List < String > colors )
        {
            this.colors = colors;
        }
    
        // Getter
        public List < String > getColors ( )
        {
            return this.colors;
        }
    }
    

    使用那个枚举。

    for ( ColorGroup colorGroup : ColorGroup.values() )
    {
        System.out.println( "colorGroup name: " + colorGroup + " contains: " + colorGroup.getColors() );
    }
    

    颜色组名称:DARK_ORANGE 包含:[3darkchartreuse]

    颜色组名称:DULL_GRAY 包含:[4mutedcyan, 3lightmaroon]


    Map

    如果您想为每个数组关联一个文本名称,请使用Map。映射将条目存储为配对,即导致值的键。在您的情况下,键是 String 对象,值是数组。

    Map < String, String[] > map = new TreeMap <>();
    map.put( "Dark Orange" , new String[] { "3darkchartreuse" } );
    map.put( "Dull Gray" , new String[] { "4mutedcyan" , "3lightmaroon" } );
    
    System.out.println( map );
    

    运行时:

    {深橙色=[Ljava.lang.String;@77459877, 暗灰色=[Ljava.lang.String;@5b2133b1}

    枚举与文本

    使用文本进行此类标记可能容易出错。例如,拼写 "Dark Grey""Dark Gray"

    所以你可以选择使用非常简单但功能强大的enum facility found in Java。枚举对象是constants,在类加载时自动实例化。作为常量,它们的名称按照 Java 约定以全大写形式书写。作为命名对象,它们的使用在编译时检测拼写错误,并提供type-safety

    enum ColorGroupName
    {
        DARK_ORANGE,
        DULL_GRAY
    }
    

    EnumMap

    对于使用枚举对象作为键的Map,使用EnumMap 实现以非常快的速度执行,使用很少的内存。

    Map < ColorGroupName, String[] > map = new EnumMap( ColorGroupName.class );
    map.put( ColorGroupName.DARK_ORANGE , new String[] { "3darkchartreuse" } );
    map.put( ColorGroupName.DULL_GRAY , new String[] { "4mutedcyan" , "3lightmaroon" } );
    
    System.out.println( map );
    

    集合与数组

    我们中的许多人更喜欢 collections 而不是数组。

    Map < ColorGroupName, List < String > > map = new EnumMap( ColorGroupName.class );
    map.put( ColorGroupName.DARK_ORANGE , List.of( "3darkchartreuse" ) );
    map.put( ColorGroupName.DULL_GRAY , List.of( "4mutedcyan" , "3lightmaroon" ) );
    
    System.out.println( map );
    

    运行时:

    {DARK_ORANGE=[3darkchartreuse], DULL_GRAY=[4mutedcyan, 3lightmaroon]}

    不可变数据

    如果您的地图要保持不变,请使用Map.of 创建unmodifiable map

    Map < ColorGroupName, List < String > > map =
            Map.of(
                    ColorGroupName.DARK_ORANGE , List.of( "3darkchartreuse" ) ,
                    ColorGroupName.DULL_GRAY , List.of( "4mutedcyan" , "3lightmaroon" )
            );
    
    System.out.println( map );
    

    包含数据的枚举

    如果你想变得更聪明,你可以将你的颜色列表存储在你的枚举中。

    枚举是一种特殊的 Java 类,但仍然是 Java 类。作为一个 Java 类,它可以携带成员变量。它可以提供一个构造函数。要在枚举中存储数据,请将每个枚举对象的数据传递给其构造函数调用。

    enum ColorGroup
    {
        DARK_ORANGE( List.of( "3darkchartreuse" ) ),
        DULL_GRAY( List.of( "4mutedcyan" , "3lightmaroon" ) );
    
        private List < String > colors;
    
        // Constructor
        ColorGroup ( List < String > colors )
        {
            this.colors = colors;
        }
    
        // Getter
        public List < String > getColors ( )
        {
            return this.colors;
        }
    }
    

    使用那个枚举。

    for ( ColorGroup colorGroup : ColorGroup.values() )
    {
        System.out.println( "colorGroup name: " + colorGroup + " contains: " + colorGroup.getColors() );
    }
    

    颜色组名称:DARK_ORANGE 包含:[3darkchartreuse]

    颜色组名称:DULL_GRAY 包含:[4mutedcyan, 3lightmaroon]

    Map 实现

    这是我为帮助选择Map 实现而制作的图表。

    【讨论】:

    • 这应该是提供更多上下文的公认答案。另一个答案看起来更像是复制/粘贴。
    • @pzaenger 您的评论促使我将最终的最佳解决方案放在新的“tl;dr”部分中。谢谢。
    • @BasilBourque 您的解决方案实际上是权威的解决方案。它已被重新接受。诚然,答案很长,但感谢您的彻底性。另一篇博文被接受以帮助提高 TheStackWizards 的声誉。
    • 希望@TheStackWizards 删除抄袭帖子。
    • 您的答案值得赏金,但其他用户可能会得到它,以增加新用户的声誉和参与度。如果您愿意,您将在到期时收到赏金。但是,如果您想大方一点,就像您所知道的那样,您会考虑让另一个同样彻底的答案来获奖吗?
    【解决方案2】:

    将键和值存储在一个以分隔符分隔的字符串数组中(更易于维护),例如

    public class MaryPoppinsBagandWeasleyTent {
    
        private static final String DELIMITER_SEMICOLON = ";";
    
        private static final String[] OPTIONS = {
                "darkorange;3darkchartreuse",
                "stripedfuchsia;5stripedlavender",
                "dullgray;4mutedcyan;3lightmaroon",
                "dullchartreuse;3lighttan;3dottedbronze",
    
        };
    
        public static void main(String[] args) {
            String q = "dullgray";
            String[] split;
            List<String> result = new ArrayList<>(0);
            for (String o : OPTIONS) {
                if (null != o && o.startsWith(q)) {
                    split = o.split(DELIMITER_SEMICOLON);
                    for (int i = 1; i < split.length; i++) {
                        result.add(split[i]);
                    }
                }
            }
            System.out.println(result);
        }
    

    【讨论】:

      【解决方案3】:

      另一种解决方案是使用二维数组来存储您的字符串数组。您可以使用下面的代码进行此实现。

      String[] names = {"darkorange", "stripedfuchsia",
                  "dullgray", "dullchartreuse"};
      
          String directs = "";
      
          String[][] matrix = {darkorange, stripedfuchsia,
                  dullgray, dullchartreuse}; // 2D string arrays
      
          for (int i = 0; i < matrix.length; i++) {
              for(int j= 0; j < matrix[i].length; j++)
              if (matrix[i][j]=="shinygold") {
                  System.out.println(names[i]);
                  directs += (names[i] + ",");
              }
          }
      

      【讨论】:

        【解决方案4】:
        Map<String, String[]> map = new TreeMap<>();
        map.put("Dark Orange", new String[]{"3darkchartreuse"});
        map.put("Dull Gray", new String[]{"4mutedcyan", "3lightmaroon"});
        
        System.out.println(map);
        

        【讨论】:

          猜你喜欢
          • 2020-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 2017-08-27
          • 1970-01-01
          相关资源
          最近更新 更多