Обновление значения атрибута в классе

#java #class

#java #класс

Вопрос:

У меня есть следующий код в Card.java класс:

 public class Card{
private String card,notation;
private int frequency,removed,dea<

public Card(String notation,String card){
    this.notation = notation;
    this.card = card;
}

public String getCard(){
    return card;
}

public void setFrequency(int frequency){
    this.frequency = frequency;
}

public int getFrequency(){
    return frequency;
}

}
  

и следующий код в Cardstack.java:

 public class Cardstack{

private static ArrayList<Card> cardstack = new ArrayList<>();

public boolean addToStack(Card card){
    for(Card c: cardstack){
        if(c.getCard().equals(card.getCard())){
            return false;
        }
    }
    return cardstack.add(card);
}

public void shuffleStack(){
    Collections.shuffle(cardstack);
}

public ArrayList<Card> getCards() {
    return cardstack;
}

}
  

Теперь, всякий раз, когда мне нужно добавлять карты из обозначения кости, скажем, 2d3, я делаю следующее:

 Cardstack stack = new Cardstack();
for(i=2;i<=6;i  ){
    Card card = new Card("2d3","" i);
    stack.add(card);
}
  

Он работает нормально, пока мне не придется обновлять частоту карты. Предположим, если мне нужно сейчас обновить частоту карты «3» кости «2d3» (которая уже добавлена в стек), как мне это сделать? (имейте в виду, что карта «3» кубика «2d3» отличается от карты «3» другого кубика, скажем «2d4»)

Комментарии:

1. Похоже, что вы получите соответствующий Card и вызовете его setFrequency() метод с соответствующим аргументом. Возможно, вы бы использовали этот Card getFrequency() метод, чтобы определить, какой аргумент необходим. Это кажется простым, так о чем вы на самом деле спрашиваете?

2. getFrequency() и setFrequency() для выбранной карты будет делать то, что вы ищете.

3. Можете ли вы объяснить, что такое обозначение dice? Потому что я думаю, что вы хотите обновить card поле при изменении частоты, верно?

Ответ №1:

Как и сейчас, вам нужно пройти через весь ArrayList

 for(Card c: cards){
...
}
  

чтобы найти соответствующую карточку, используя метод equals из Card (вы должны переопределить его).

Более элегантным решением было бы использовать HashMap (a, b), где a = card.notation , тогда вы могли бы искать карту с помощью hashmap.get(card notation) для обновления частоты.

Затем вы могли бы просто сохранить ключи (обозначение карты) в качестве фактического стека и перетасовать их: List keys = new ArrayList(map.keySet()); Collections.shuffle(ключи);

Ответ №2:

По умолчанию метод equals() сравнивает все переменные-члены, поэтому здесь также указана частота. Это то, что вы хотите?

Если карта равна другой только тогда, когда ее переменные card и notation совпадают, тогда вам необходимо переопределить метод equals по умолчанию.

Комментарии:

1. Когда вы предлагаете переопределить equals() , пожалуйста, также укажите, что вы должны переопределить hashCode() . НИКОГДА не переопределяйте equals(), если вы не знаете, что делаете. Это может привести ко всевозможным странным побочным эффектам. Google: hashCode() равно() контракту.

2. Вы правы, но зачем отклонять мой комментарий только из-за этого?

3. Потому что на данный момент ваш ответ — плохой совет, и его использование приведет к плохому решению, которое может привести к трудным для отслеживания ошибкам.

4. Я думаю, вы несправедливы ко мне. Идея неправильная или правильная? Если это правильное решение данной проблемы, почему вы голосуете против меня? Я ценю ваш комментарий, но вы отрицаете мое решение из-за небольшого упущения (важно, это правда, но все же слабо относится к проблеме).

5. В вашем ответе много чего не так. Прежде всего, значение по умолчанию (значение объекта) equals() не сравнивает все члены, а просто «возвращает (this == obj);». Кстати, это задокументировано в JavaDocs Object.equals() . Таким образом, equals по умолчанию возвращает значение true только в том случае, если ссылка на объект одинакова. Второе: простая реализация вашего ответа нарушит базовую функциональность Java, нарушив контракт equals() hashCode() — см. Их JavaDocs. Из вопроса я предполагаю, что OP не является опытным программистом, поэтому, чтобы сделать ваш ответ хорошим, вы должны хотя бы упомянуть указанные тонкости.