2013-06-18 3 views
0

Я пишу игру «Сапер», и я пытаюсь использовать хешсет. Мой вопрос в том, может ли hashset содержать как целые числа, так и строки? Используемый мной hastset имеет в основном строки и один, который является целым числом. Это можно сделать? Когда я скомпилирую его, он дает мне ошибку, что переменная _minecount не может быть найдена, ничего об этом не является строкой. Это мой код:Minesweeper hashset

import java.util.Set; 
import java.util.HashSet; 

/** 
* Represents a single square in Minesweeper. 
* 
* @author Sophia Ali 
*/ 
public class MineSquare 
{ 
    //Constants: 
    // Fields: 
    private String _shown;  // What a square is showing now 
    private boolean _mined;  // Square is mined or not 
    private boolean _flagged; // Square is flagged or not 
    private boolean _questioned; // Square is question marked or not 
    private int  _minecount; // Square's surrounding mine count 
    private boolean _opened;  // Player has opened this square or not 
    private static final String[] VALID_SHOWN_TEXT = {"X", 0 < minecount && _minecount < 8, " ", "F", "?"}; 
    private HashSet<String> validShownTextSet = 
    new HashSet<String>(java.util.Arrays.asList(VALID_SHOWN_TEXT)); 

    // Constructors & Methods: 

    /** 
    * Default constructor 
    * Sets _mined and _opened to false. 
    */ 
    public MineSquare() 
    { 
     _mined = false; 
     _opened = false; 
     setShown(" "); 
    } 





    /** 
    * Returns flagged status of square. 
    * @return _flagged Flagged status 
    */ 
    public boolean isFlagged() { 
     return _flagged; 
    } 





    /** 
    * Sets or unsets flag on a square. 
    * @param flagged True or false (square is flagged or not) 
    */ 
    public void setFlagged(boolean flagged, boolean opened) { 
     _flagged = flagged; 
     _opened = opened; 

     // If Minesquare opened do nothing: 
     if (opened == true) 
     setShown(" "); 

     // If flagged, square should show "F": 
     if (isFlagged() == true) 
      setShown("F"); 
     else 
      setShown(" ");    
    } 


    public int getMinecount() { 
     return _minecount; 
    } 





    public void setMinecount(int minecount) { 
     _minecount = minecount; 

     if (0 < minecount && minecount < 8) 
     { 
     setShown("Error:" + minecount); 

    } 
} 





    public boolean isMined() { 
     return _mined; 
    } 





    public void setMined(boolean mined) { 
     _mined = mined; 


    } 





    public boolean isOpened() { 
     return _opened; 
    } 





    /** 
    * Open a square. 
    * (Once opened, a square can't be unopened.) 
    */ 
    public void setOpened() { 
     _opened = true; 

     if (isMined() == true) 
      setShown("X"); 
     else if (getMinecount() > 0) 
      setShown(_minecount + ""); 
     else // blank space for _minecount = 0 
      setShown(" "); 
    } 





    public boolean isQuestioned() { 
     return _questioned; 
    } 





    public void setQuestioned(boolean questioned, boolean opened) { 
     _questioned = questioned; 
     _opened = opened; 
     // If Minesquare opened do nothing: 
     if (opened == true) 
     setShown(" "); 

     // If Questioned, square should show "F": 
     if (isQuestioned() == true) 
      setShown("F"); 
     else 
      setShown(" "); 
    } 





    public String getShown() { 
     return _shown; 
    } 





    public void setShown(String shown) { 
     _shown = shown; 
     /*if (shown.equals("X")) { 
      this.shown = shown; 
     } else if (shown.equals(0 < minecount && minecount < 8)) { 
      this.shown = shown; 
     } else if (shown.equals(" ")) { 
      this.shown = shown; 
     } else if (shown.equals("F")) { 
      this.shown = shown; 
     } else if (shown.equals("?")) { 
      this.shown = shown; 
     } else { 
      this.shown = "Error + shown"; 
     } 
     */ 
     if (validShownTextSet.contains(shown)) { 
      this.shown = shown; 
     } else { 
      this.shown = "Error" + shown; 
     } 
    } 





    } 
+0

Только если вы используете 'HashSet ', так как нет другого суперкласса, общего как для Integer, так и для 'String'. – fge

+0

Что это за линия? private static final String [] VALID_SHOWN_TEXT = {"X", 0

+0

@fge Спасибо! но я все еще получаю сообщение об ошибке «не могу найти символ - переменная minecount». Это связано с тем, что это целое число, а не строка или потому, что minecount не инициализирован заранее? –

ответ

2

Эта линия

private static final String[] VALID_SHOWN_TEXT = {"X", 0 < minecount && _minecount < 8, " ", "F", "?"}; 

имеет несколько проблем. Здесь нет переменной minecount. Переменная _minecount не является статической переменной, поэтому она недоступна из статической области, которую вы сделали, сделав статический ток VALID_SHOWN_TEXT.

И как вы уже догадались, вы не можете сохранить boolean из выражения 0 < minecount && _minecount < 8 в массив String. Даже если вы можете получить выражение boolean, вам придется преобразовать его в String, чтобы сохранить его в массиве String.

// or a working boolean expression here. 
..., String.valueOf(0 < minecount && _minecount < 8), ... 

HashSet<Object> может содержать как целые числа и строки, но здесь, похоже, вы можете просто конвертировать то, что вам нужно в массив строк, который должен быть в состоянии быть преобразованы в HashSet<String>.

+0

Я попытался использовать строку String.value, однако по-прежнему получаю ошибку для minecount. Я попытался инициализировать его, но тогда я получаю нестатические переменные minecount не могут ссылаться на статическую ошибку контекста. Я не уверен, как это исправить. Я попытался инициализировать его, я попытался установить minecount = _minecount; однако появляется такая же ошибка –