试图让java程序将项添加到未接受的ArrayList

时间:2013-11-21 15:42:22

标签: java arraylist

我写了一个java野餐游戏(非常基本),我唯一不知道该怎么做的是让程序不接受同一个字母的项目。我还希望程序列出用户输入被拒绝项目的次数。请注意,这允许任何项目的排序,只要没有两个项目以相同的字母开头(dis- 关于案件)。可接受的输入序列将是 芥末 , 番茄酱 , 豆腐 , 鳀鱼 。 然而, 芥末 , 番茄酱 , 豆腐 ,和 水壶玉米 自从\ 水壶玉米 “开始 用同样的字母作为\ 番茄酱

“(忽略大小写)。

import java.util.*;

public class PlayPicnic
{
    public static void main(String[] args)
    {

        Scanner scan = new Scanner(System.in);
        Picnic picnic = new Picnic();
        ArrayList<String> unaccepted = new ArrayList<>();`enter code here`

        while (picnic.numberOfItems() < 5)
        {
            System.out.print("What do you want to bring on the picnic? ");
            String item = scan.nextLine();
            if (picnic.okayToBring(item))
            {
                picnic.add(item);
            }
            else
            {

               if(!unaccepted.contains(item)) unaccepted.add(item);
           System.out.println("Sorry, you can't bring " + item);

            }
         }
        System.out.println("\nHere's what we'll have at the picnic:");
        picnic.show();
    System.out.println(Arrays.toString(unaccepted.toArray()));



    }
}

对应的班级

import java.util.*;

public class Picnic
{
    // INSTANCE VARIABLES:
    private ArrayList<String> stuffToBring; // items to bring on the picnic

    // CONSTRUCTOR:

    //-----------------------------------------------------
    // Construct a new Picnic.
    //-----------------------------------------------------
    public Picnic()
    {
        stuffToBring = new ArrayList<String>(); // initialize list
    }

    //-----------------------------------------------------
    // Given an item s, see if it's okay to add it to the list.
    // Return true if it is, false otherwise:
    //-----------------------------------------------------
    public boolean okayToBring(String s)
    {
        // "Secret rule" -- s can't be an item already in the list:
        if (stuffToBring.contains(s)) // "contains" is in the ArrayList class
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    //-----------------------------------------------------
    // Given an item s, add it to the list (if it's okay to add it)
    //-----------------------------------------------------
    public void add(String s)
    {
        if (okayToBring(s)) // this test keeps people from cheating!
        {
            stuffToBring.add(s);
        }

    }

    //-----------------------------------------------------
    // Print the items in the list
    //-----------------------------------------------------
    public void show()
    {
        for (int i = 0; i < stuffToBring.size(); i++)
        {
            String s = stuffToBring.get(i);
            System.out.println(s);
        }


    }

    //-----------------------------------------------------
    // Returns the number of items in the list:
    //-----------------------------------------------------
    public int numberOfItems()
    {
        return stuffToBring.size();
    }
}

3 个答案:

答案 0 :(得分:0)

如果第一个字符相同(忽略大小写),请创建自定义Set以删除重复项。

    Set<String> unaccepted =new TreeSet<>(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
          Character first=Character.toLowerCase(o1.charAt(0));
          Character second=Character.toLowerCase(o2.charAt(0));
          return first.compareTo(second);
        }           
    });

现在,将值添加到此Set。它将忽略相同的第一个Character数据。


更改while循环,如下所示

   while (unaccepted.size()<5){
        System.out.print("What do you want to bring on the picnic? ");
        String item = scan.nextLine();
        unaccepted.add(item);
     }

答案 1 :(得分:0)

以下是使用第一个字符

检查列表中项目的逻辑
public boolean checkItem(String input, List<String> items) {

        String inputFirstChar = input.substring(0, 1);
        boolean exist = false;

        for (String item : items) {

            String itemFirstChar = item.substring(0, 1);

            if(itemFirstChar.equalsIgnoreCase(inputFirstChar)) {
                exist = true;
                 break;
             }

        }

        return exist;
    }


private ArrayList<String> stuffToBring;

使用接口而不是ArrayList实现来创建引用变量类型,就像这样做

private List<String> stuffToBring;

答案 2 :(得分:0)

要拒绝使用第一个字母的单词,请在“Picnic”类中添加一个简单的字符串:

private String usedLetters = "";

然后在方法“okayToBring”中检查字母是否已被使用:

public boolean okayToBring(String s) {
  return (usedLetters.indexOf(s.toLowerCase().charAt(0)) == -1); // letter not contained in String
}

并在方法“add”中将新单词的第一个字符附加到此字符串:

public void add(String s)
{
  if (okayToBring(s))
  {
    stuffToBring.add(s);
    usedLetters += s.toLowerCase().charAt(0);
  }
}

关于你的第二个问题,你的措词有点不清楚。如果您想要计算特定项目未成功输入的次数,您可以使用Hashmap存储被拒绝的字符串及其计数:

private HashMap<String, int> unaccepted = new HashMap<String, int>();

然后你的程序的“else”子句如下所示:

int newcount = (unaccepted.containsKey(item) ? unaccepted.get(item)++ : 1);
unaccepted.put(item, newcount);
System.out.println("Sorry, you can't bring " + item + "(" + unaccepted.get(item) + " unsuccessful tries)");

如果您只想计算不成功条目的总数,请使用Set和println(unaccepted.size());