#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 не является опытным программистом, поэтому, чтобы сделать ваш ответ хорошим, вы должны хотя бы упомянуть указанные тонкости.