Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是操作一组变量的有效方法?_Java - Fatal编程技术网

Java 什么是操作一组变量的有效方法?

Java 什么是操作一组变量的有效方法?,java,Java,我正在做一个“基因模拟器”,在某个时候我想比较基因中的数据,以确定个体的结果。我想出了一个解决办法,但似乎很不切实际,我相信有一个正确的方法 现在,我在一个支持类中使用一个静态方法来处理操作,但我担心维护会很烦人,因为我计划经常修改属性列表 public class GeneOps { public static AttributeList AddAttributeLists (AttributeList a, AttributeList b) { Attribute

我正在做一个“基因模拟器”,在某个时候我想比较基因中的数据,以确定个体的结果。我想出了一个解决办法,但似乎很不切实际,我相信有一个正确的方法

现在,我在一个支持类中使用一个静态方法来处理操作,但我担心维护会很烦人,因为我计划经常修改属性列表

public class GeneOps {  
    public static AttributeList AddAttributeLists (AttributeList a, AttributeList b) {
        AttributeList x=new AttributeList();

        x.agressiveness= a.agressiveness+b.agressiveness;
        x.bravery=a.bravery+b.bravery;
        x.speed=a.speed+b.speed;
        //Repeat for all attributes

        return x;
    }
}

这是可行的,但我希望在每次我决定向列表中添加某些内容时自动更新这些内容,例如:如果我添加了一个名为“潜行”的属性,我希望在不修改方法的情况下对其进行计算。

一个选项是,如果所有属性都由一个数值表示,则可以将实际属性设置为枚举,比如:

public enum Attribute {
    AGGRESSIVENESS, BRAVERY, SPEED, WISDOM, INTELLIGENCE, CHARISMA, DEXTERITY // more as needed
}
然后在保存属性的类中,使用一个
映射
,如果需要,可以为该映射分配一个
枚举映射
,通过使用枚举作为键在映射中迭代,可以轻松地将两个属性映射添加到一起:

// add all values of this object's attributes with 2nd map
public void addAttributes(Map<Attribute, Integer> attributes2) {
    for (Attribute attribute : Attribute.values()) {
        int value = attributes.get(attribute) + attributes2.get(attribute);
        attributes.put(attribute, value);
    }
}
//使用第二个映射添加此对象属性的所有值
公共void addAttributes(映射属性2){
for(属性:Attribute.values()){
int value=attributes.get(attribute)+attributes2.get(attribute);
属性。放置(属性,值);
}
}
更安全的做法是检查空(null)映射值并进行更正:

// add all values of this object's attributes with 2nd map
public void addAttributes(Map<Attribute, Integer> attributes2) {
    for (Attribute attribute : Attribute.values()) {
        int value = attributes.get(attribute) != null ? attributes.get(attribute) : 0;
        int value +=  attributes2.get(attribute) != null ? attributes2.get(attribute) : 0;
        attributes.put(attribute, value);
    }
}
//使用第二个映射添加此对象属性的所有值
公共void addAttributes(映射属性2){
for(属性:Attribute.values()){
int value=attributes.get(attribute)!=null?attributes.get(attribute):0;
int value+=attributes2.get(属性)!=null?attributes2.get(属性):0;
属性。放置(属性,值);
}
}
例如:

public class Individual {
    private Map<Attribute, Integer> attributes;

    // default constructor
    public Individual() {
        // create map and initialize all attributes to 0
        attributes = new EnumMap<>(Attribute.class);
        for (Attribute attribute : Attribute.values()) {
            attributes.put(attribute, 0);
        }
    }

    // constructor that sets attributes
    public Individual(Map<Attribute, Integer> attributes) {
        this.attributes = attributes;
    }

    public Map<Attribute, Integer> getAttributes() {
        return attributes;
    }

    public void setAttributes(Map<Attribute, Integer> attributes) {
        this.attributes = attributes;
    }

    public void setAttribute(Attribute attribute, int value) {
        attributes.put(attribute, value);
    }

    public int getAttribute(Attribute attribute) {
        return attributes.get(attribute).intValue();
    }

    // add all values of this object's attributes with 2nd map
    public void addAttributes(Map<Attribute, Integer> attributes2) {
        for (Attribute attribute : Attribute.values()) {
            int value = attributes.get(attribute) != null ? attributes.get(attribute) : 0;
            int value +=  attributes2.get(attribute) != null ? attributes2.get(attribute) : 0;
            attributes.put(attribute, value);
        }
    }

    public void addAttributes(Individual individual2) {
        addAttributes(individual2.getAttributes());
    }

     public String displayAttributes() {
        StringBuilder sb = new StringBuilder();
        // ... iterate through the attributes appending to the StringBuilder
        return sb.toString();
    }
}
公共类个人{
私有地图属性;
//默认构造函数
公众人士(){
//创建映射并将所有属性初始化为0
attributes=新的枚举映射(Attribute.class);
for(属性:Attribute.values()){
attributes.put(属性,0);
}
}
//设置属性的构造函数
公共个人(地图属性){
this.attributes=属性;
}
公共映射getAttributes(){
返回属性;
}
公共void集合属性(映射属性){
this.attributes=属性;
}
公共void setAttribute(属性,int值){
属性。放置(属性,值);
}
公共int getAttribute(属性){
返回attributes.get(attribute).intValue();
}
//使用第二个贴图添加此对象属性的所有值
公共void addAttributes(映射属性2){
for(属性:Attribute.values()){
int value=attributes.get(attribute)!=null?attributes.get(attribute):0;
int value+=attributes2.get(属性)!=null?attributes2.get(属性):0;
属性。放置(属性,值);
}
}
公共属性(个人2){
addAttributes(individual2.getAttributes());
}
公共字符串displaytattributes(){
StringBuilder sb=新的StringBuilder();
//…遍历附加到StringBuilder的属性
使某人返回字符串();
}
}

一个选项是,如果所有属性都由一个数值表示,则可以将实际属性设置为枚举,如:

public enum Attribute {
    AGGRESSIVENESS, BRAVERY, SPEED, WISDOM, INTELLIGENCE, CHARISMA, DEXTERITY // more as needed
}
然后在保存属性的类中,使用一个
映射
,如果需要,可以为该映射分配一个
枚举映射
,通过使用枚举作为键在映射中迭代,可以轻松地将两个属性映射添加到一起:

// add all values of this object's attributes with 2nd map
public void addAttributes(Map<Attribute, Integer> attributes2) {
    for (Attribute attribute : Attribute.values()) {
        int value = attributes.get(attribute) + attributes2.get(attribute);
        attributes.put(attribute, value);
    }
}
//使用第二个映射添加此对象属性的所有值
公共void addAttributes(映射属性2){
for(属性:Attribute.values()){
int value=attributes.get(attribute)+attributes2.get(attribute);
属性。放置(属性,值);
}
}
更安全的做法是检查空(null)映射值并进行更正:

// add all values of this object's attributes with 2nd map
public void addAttributes(Map<Attribute, Integer> attributes2) {
    for (Attribute attribute : Attribute.values()) {
        int value = attributes.get(attribute) != null ? attributes.get(attribute) : 0;
        int value +=  attributes2.get(attribute) != null ? attributes2.get(attribute) : 0;
        attributes.put(attribute, value);
    }
}
//使用第二个映射添加此对象属性的所有值
公共void addAttributes(映射属性2){
for(属性:Attribute.values()){
int value=attributes.get(attribute)!=null?attributes.get(attribute):0;
int value+=attributes2.get(属性)!=null?attributes2.get(属性):0;
属性。放置(属性,值);
}
}
例如:

public class Individual {
    private Map<Attribute, Integer> attributes;

    // default constructor
    public Individual() {
        // create map and initialize all attributes to 0
        attributes = new EnumMap<>(Attribute.class);
        for (Attribute attribute : Attribute.values()) {
            attributes.put(attribute, 0);
        }
    }

    // constructor that sets attributes
    public Individual(Map<Attribute, Integer> attributes) {
        this.attributes = attributes;
    }

    public Map<Attribute, Integer> getAttributes() {
        return attributes;
    }

    public void setAttributes(Map<Attribute, Integer> attributes) {
        this.attributes = attributes;
    }

    public void setAttribute(Attribute attribute, int value) {
        attributes.put(attribute, value);
    }

    public int getAttribute(Attribute attribute) {
        return attributes.get(attribute).intValue();
    }

    // add all values of this object's attributes with 2nd map
    public void addAttributes(Map<Attribute, Integer> attributes2) {
        for (Attribute attribute : Attribute.values()) {
            int value = attributes.get(attribute) != null ? attributes.get(attribute) : 0;
            int value +=  attributes2.get(attribute) != null ? attributes2.get(attribute) : 0;
            attributes.put(attribute, value);
        }
    }

    public void addAttributes(Individual individual2) {
        addAttributes(individual2.getAttributes());
    }

     public String displayAttributes() {
        StringBuilder sb = new StringBuilder();
        // ... iterate through the attributes appending to the StringBuilder
        return sb.toString();
    }
}
公共类个人{
私有地图属性;
//默认构造函数
公众人士(){
//创建映射并将所有属性初始化为0
attributes=新的枚举映射(Attribute.class);
for(属性:Attribute.values()){
attributes.put(属性,0);
}
}
//设置属性的构造函数
公共个人(地图属性){
this.attributes=属性;
}
公共映射getAttributes(){
返回属性;
}
公共void集合属性(映射属性){
this.attributes=属性;
}
公共void setAttribute(属性,int值){
属性。放置(属性,值);
}
公共int getAttribute(属性){
返回attributes.get(attribute).intValue();
}
//使用第二个贴图添加此对象属性的所有值
公共void addAttributes(映射属性2){
for(属性:Attribute.values()){
int value=attributes.get(attribute)!=null?attributes.get(attribute):0;
int value+=attributes2.get(属性)!=null?attributes2.get(属性):0;
属性。放置(属性,值);
}
}
公共属性(个人2){
添加