当前位置: 首页 > 知识库问答 >
问题:

配置设置类的置换算法

乐正翰
2023-03-14

我整天都在想我的项目的解决方案,需要根据类中的“步骤”字段来排列对象列表。我有以下课程:

public class Configuration{
     private String name;
     private int start; //starting value
     private int end;  //ending value
     private int step; //append this to start value until end value is reached
}

//if I have the following sample:
    List<Configuration> configurations = new ArrayList<>();
    Configuration config1 = new Configuration("congif1", 1,2,1);
    Configuration config2 = new Configuration("config2", 100,200,50);

我需要实现一个方法:

public Object/void print(List<Configuration> configurations);

这样,预期的输出将(在任何顺序,只要值是完整的)

1,100
2,100
1,150
2,150
1,200
2,200

我需要根据用户给定的配置设置运行所有不同的配置场景。如果我有3个对象:

Configuration config1 = new Configuration("congif1", 1,2,1);
Configuration config2 = new Configuration("config2", 100,150,50);
Configuration config3 = new Configuration("config3", 1000,2000,500);

那么输出应该是:

1,100,1000
2,100,1000
1,150,1000
2,150,1000
1,100,1500
2,100,1500
1,150,1500
2,150,1500
1,100,2000
2,100,2000
1,150,2000
2,150,2000

我尝试了以下嵌套循环,但它不会置换所有循环:

for(Configuration config:configurations){
     for(int i=start; i<end; i+=step){
          //code here
     }
}

我想我需要一个递归类型,但我真的不知道怎么做

共有1个答案

呼延德华
2023-03-14

首先,我应该指出你的代码不正确。如何在循环中定义startendstep?你怎么能接触到它们?

接下来,我将向类Configuration添加getter和一个方法,在两个配置之间进行排列,如下所示:

public class Configuration {

     private String name;
     private int start;
     private int end;
     private int step;
     
     public Configuration(...) { // Some constructor }

     public int getStart() { return start; }

     public int getEnd() { return end; }

     public int getStep() { return step; }

     public void permutateWith(Configuration c) {
          for(int i = start; i <= end; i += step) {
               for(int j = c.getStart(); j <= c.getEnd(); j += c.getStep()) {
                    System.out.println(i + "," + j);
               }
          }
     }

}

有了这个类,我们可以创建两个实例

Configuration config1 = new Configuration("congif1", 1,2,1);
Configuration config2 = new Configuration("config2", 100,200,50);

并将其添加到列表中:

List<Configuration> configurations = new ArrayList<>();
configurations.add(config1);
configurations.add(config2);

现在,您可以编写一个方法printPermutations(List

private void printPermutations(List<Configuration> list) {
     
     // Pick one element
     for(int i = 0; i < list.length; i++) {
          // Combine with all the others
          for(int j = i + 1; j < list.length; j++) {
               list.get(i).permutateWith(list.get(j));
          }
     }
}

我自己没试过但应该能解决你的问题。

 类似资料:
  • Settings(配置设置) 是影响FreeMarker行为的已被命名的值。配置设置有很多, 例如:locale,number_format, default_encoding, template_exception_handler。可以参考 Configuration.setSetting(...)的Java API 文档 来查看配置设置的完整列表。 配置设置存储在 Configuration

  • 有两个命令使用得最多了,从第一次调用 Git 到每天的日常微调及参考,这个两个命令就是: config 和 help 命令。 git config Git 做的很多工作都有一个默认方式。 对于绝大多数工作而言,你可以改变 Git 的默认方式,或者根据你的偏好来设置。 这些设置涵盖了所有的事,从告诉 Git 你的名字,到指定偏好的终端颜色,以及你使用的编辑器。 此命令会从几个特定的配置文件中读取和写

  • 在 Serenity 平台,配置设置是只是简单的类,如: [SettingScope("Application"), SettingKey("Logging")] private class LogSettings { public LoggingLevel Level { get; set; } public string File { get; set; } publi

  • cmf_set_option($key, $data, $replace = false) 功能 设置系统配置,通用 参数 $key: string 配置键值,都小写 $data: array 配置值,数组 $replace: array 是否完全替换 返回 bool 是否成功

  • cmf_set_dynamic_config($data) 功能 设置动态配置 参数 $data: array 要设置的数据,格式["cmf_default_theme"=>'simpleboot3'] 返回 boolean

  • X2.2.0新增 sp_set_option($key,$data) 功能: 设置系统配置,通用 参数: $key: 配置的键名,英文下划线小写,最好加上自己的应用或插件名作为前级 $data:配置的值,数组 返回: 类型boolean,true设置成功 使用: $result = sp_set_option('portal_custom_settings',array('test'=>1));