【问题标题】:Finding and changing tuples values查找和更改元组值
【发布时间】:2020-06-26 05:10:55
【问题描述】:

我已经有一些这样的元组:

public GreenhouseControls() {
        light = new Tuple<>("light", "off");
        fans = new Tuple<>("fans", "off");
        water = new Tuple<>("water", "off");
        power = new Tuple<>("power", "on");
        window = new Tuple<>("window", "good");
        thermostat = new Tuple<>("thermostat","day");
}

我正在尝试在同一个类中使用setVariable() 方法,该方法将接收 2 个字符串(例如,“light”和“on”),并使用第一个字符串搜索第一个变量元组,当找到匹配项时,它将用第二个字符串替换第二个变量。 我尝试将元组添加到 ArrayList 但我无法让搜索部分工作。 有没有办法通过ArrayListHashSet 来实现这一点?


元组类:

   public static class Tuple<A,B> {
        public final A eventName;
        public final B status;

        public Tuple(A eventName, B status) {
            this.eventName = eventName;
            this.status = status;
        }

        public String toString() {
            return "(" + eventName + ", " + status + ")";
        }
    }

【问题讨论】:

  • 也许HashMap 更合适?
  • @Sweeper 我对 HashMap 不是很熟悉(但我用 Google 搜索过,所以我认为我掌握了它的基础知识)所以您的意思是将元组存储在 hashmap 中或使用 hashmap 而不是元组?
  • 为什么要使用哈希图?或者任何与此相关的列表数据结构?我会阅读 Java 面向对象并使用常见模式、getter/setter 方法来实现这一点?
  • 你在使用groovy.lang.Tuple吗?
  • @Jesse 但即使我在 getter 中使用 getter/setter,我也需要一种方法来检查每个元组中我正在寻找的字符串,所以我需要一种方法来查看每个元组都需要一个列表或哈希图,对吗?

标签: java arraylist tuples


【解决方案1】:

我已经实现了如何为对象的单个变量执行此操作。即“光”。 您是否需要将冗余变量捕获为元组?

public class GreenhouseControls {
  
    private String light;
    
    public String getLightStatus() {
        return light;
    }
   
   public void setLightStatus(String input)
   {
       if(input == "on" || input == "off")
       this.light = input;
   }
   
   public static void main(String[] args)
   {
       GreenhouseControls controls = new GreenhouseControls();
       controls.setLightStatus("on");
       System.out.println(controls.getLightStatus());
       controls.setLightStatus("off");
       System.out.println(controls.getLightStatus());
   }
   
}

【讨论】:

  • input == "on" || input == "off" 可能会导致错误,
【解决方案2】:

您可以使用Map 在键和值之间创建关系。在您的情况下,HashMap 将是合适的,并且会使您的代码更加简洁易读。您可以使用put(key,value) 设置键的值,并使用get(key) 检索与键关联的值。

final Map<String, String> map = new HashMap<>();
map.put("light","off");
//Etc..

//Get value
String light = map.get("light");//"off"
//Update value
map.put("light","on");
light = map.get("light");//"on"

如果您不允许更改代码的结构,您可以使用 Tuple 类使用 foreach 循环来实现它,如下所示:

import java.util.Arrays;
import java.util.List;
public class GreenhouseControls {    
    private final List<Tuple<String,String>> members;
    public GreenhouseControls() {
        members = Arrays.asList(
                new Tuple<>("light", "off"),
                new Tuple<>("fans", "off"),
                new Tuple<>("water", "off"),
                new Tuple<>("power", "on"),
                new Tuple<>("window", "good"),
                new Tuple<>("thermostat","day")
               );
    }
    
    public void setVariable(final String eventName, final String status) {
        for(final Tuple<String, String> tuple: members) {
            if(tuple.getEventName().equals(eventName)) {
                tuple.setStatus(status);
                return;
            }
        }
        throw new IllegalArgumentException("No event found with eventName " + eventName);
    }
    
    public String getVariable(final String eventName) {
        for(final Tuple<String, String> tuple: members) {
            if(tuple.getEventName().equals(eventName)) {
                return tuple.getStatus();
            }
        }
        return null;
    }
    
    public static class Tuple<A, B> {
        private A eventName;
        private B status;

        public Tuple(final A eventName, final B status) {
            this.eventName = eventName;
            this.status = status;
        }

        @Override
        public String toString() {
            return "(" + eventName + ", " + status + ")";
        }

        public B getStatus() {
            return status;
        }

        public void setStatus(B status) {
            this.status = status;
        }

        public A getEventName() {
            return eventName;
        }
    }
}

【讨论】:

  • 这个答案看起来不错,老实说,它会让我的生活更轻松,但我担心因为这都是作业的一部分,我必须使用元组是不可避免的,是否有办法做同样的事情除了元组之外的东西?
  • 我正在尝试打印存储元组的数组,但它看起来就像打印语句不起作用一样。 System.out.println(members) 不应该工作吗?
  • @dxbh0517 您还有其他问题或疑虑吗?
  • 不,我发现我做错了感谢所有帮助
【解决方案3】:

更简单的方法是按照 hev1 的建议使用 HashMap 来满足您的要求。但是,如果您仍然想使用 Tuple 类,那么这是一种方法。

将 getter 方法添加到您的 Tuple

public class Tuple<A,B> {
    public final A eventName;
    public final B status;

    public Tuple(A eventName, B status) {
        this.eventName = eventName;
        this.status = status;
    }

    public String toString() {
        return "(" + eventName + ", " + status + ")";
    }

    public A getEventName() {
        return eventName;
    }

    public B getStatus() {
        return status;
    }
}

然后在List 中收集所有元组并将其传递给setVariable 方法。在此方法中,只需检查给定的eventName 是否存在于任何元组中。如果是,则从列表中删除该元组并创建一个具有给定状态的新元组并将其添加回列表中。像这样的:

void setVariable(String eventName, String status, List<Tuple>tuples) {
    boolean isRemoved = tuples.removeIf(tuple -> tuple.getEventName().equals(eventName));
    if(isRemoved) {
        Tuple tuple = new Tuple(eventName, status);
        tuples.add(tuple);
    }
}

希望这会有所帮助。

【讨论】:

  • 我还没有尝试过你的答案,但我认为它会起作用,但不会更容易我想没有List&lt;Tuple&gt;tuples 作为setVariable 的输入,因为如果只有一个列表,如果我在类中声明它,我可以在setVariable 中使用它。还是不行?
  • @dxbh0517 是的。如果您希望在类级别使用单个列表,则无需将其传递给 setVariable 方法。由于该方法可以访问列表
猜你喜欢
  • 1970-01-01
  • 2012-03-03
  • 2013-10-08
  • 1970-01-01
  • 2015-03-16
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多