繁体   English   中英

当 ArrayList 同时包含字符串和整数时,如何删除用户输入的元素?

[英]How do I remove an element the user input from an ArrayList when it contains both strings and integers?

我是编码新手,我对 ArrayList 的工作方式感到非常困惑。

我有 [Java] 代码:

ArrayList<Object> allCards = new ArrayList<Object>();

allCards.add(2);
allCards.add(2);
allCards.add(3);
allCards.add('K');
allCards.add('J');

打印出allCards ArrayList,我有:

[2, 2, 3, K, J]

现在,我需要接受用户输入,并从 ArrayList 中删除用户输入。 我怎么做?

我可以使用

Scanner scan = new Scanner(System.in);
int i = scan.nextInt();

allCards.remove(new Integer(i));

如果 ArrayList 仅包含整数,但用户输入可以是 char 或 int,我如何从 ArrayList 中删除它?

此外,如果 ArrayList 中有两个相同的用户输入,如数字 2,我只想删除其中一个。

谢谢你。

我认为如果你只使用 ArrayList 和字符串类型,你的问题就可以解决,比如:

    ArrayList<String> allCards = new ArrayList<String>();

关于如何移除数组列表中的元素,您可以从用户那里获取字符串中的输入,然后将其与数组列表中的元素进行比较。 当您使用 remove() 方法时,如果输入字符串匹配(区分大小写)元素,它只会删除第一个匹配项,如果不匹配,则不会。 您可以测试此代码:

    ArrayList<String> allCards = new ArrayList<String>();
    allCards.add("2");
    allCards.add("2");
    allCards.add("3");
    allCards.add("K");
    allCards.add("J");

    System.out.println("The Array List before user input: ");
    for (String card : allCards) {
        System.out.print(card + " ");
    }
    System.out.println();
    Scanner scanner = new Scanner(System.in);
    System.out.print("Input to remove from Array List: ");
    String input = scanner.nextLine();
    allCards.remove(input);

    System.out.println("The Array List after user input: ");
    for (String card : allCards) {
        System.out.print(card + " ");
    }
    scanner.close();

因此,您希望能够从输入中读取intchar 我想你必须为你的输入字符串定义一个语法,这将允许你决定它是一个int还是一个char 您可以为此使用正则表达式。

例子:

private static final Pattern RE
        = Pattern.compile("^\\s*(?:([0-9]+)|'(.)')\\s*");

    Scanner scanner = new Scanner(System.in);
    String s = scanner.nextLine();
    Matcher matcher = RE.matcher(s);
    if (!matcher.matches()) {
        System.out.println("Bad input");
    } else {
        Object key;
        if (matcher.group(1) != null) {
            key = Integer.valueOf(matcher.group(1));
        } else {
            key = matcher.group(2).charAt(0);
        }
        allCards.remove(key);
        System.out.println(allCards);
    }

这个问题有两个部分,首先您需要正确读取一个字符或 integer,然后将其从列表中删除。 首先逐行转换为 int 或 char 然后使用迭代器循环列表并删除 object 并中断。

public static void main(String[] args) {
        List<Object> allCards = new ArrayList<>();
        allCards.add(2);
        allCards.add(2);
        allCards.add(3);
        allCards.add('K');
        allCards.add('J');
        Scanner scan = new Scanner(System.in);
        while (true) {
            String line = scan.nextLine();
            try {
                int num = Integer.parseInt(line);
                for(Iterator<Object> it = allCards.iterator(); it.hasNext(); ) {
                    Object o = it.next();
                    if ((o instanceof Integer) && (Integer) o == num) {
                        allCards.remove(o); break;
                    }
                }
            } catch (Exception ex) {
                char c = line.charAt(0);
                for(Iterator<Object> it = allCards.iterator(); it.hasNext(); ) {
                    Object o = it.next();
                    if ((o instanceof Character) && (Character) o == c) {
                        allCards.remove(o); break;
                    }
                }
            }
        }
    }

您可以扩展它以支持更多对象类型。

假设您不能更改数组allCards的类型,您必须将输入转换为 Integer 和 Character 并检查它们是否包含在列表中:

        final List<Object> allCards = new ArrayList<Object>();

        allCards.add(2);
        allCards.add(2);
        allCards.add(3);
        allCards.add('K');
        allCards.add('J');

        final Scanner scanner = new Scanner(System.in);
        final String i = scanner.nextLine();

        try {
            allCards.remove(Integer.valueOf(i));
        } catch(NumberFormatException e) {
            // safe to ignore
        }
        allCards.remove(Character.valueOf(i.charAt(0)));
        
        scanner.close();

但是,如果您正在实施某种纸牌游戏,您应该考虑引入 class 或卡牌枚举类型,并使用强类型卡牌列表。 例如像这样:

    final List<Card> allCards = new ArrayList<Card>();
    allCards.add(new Card(CardValue.C2));
    allCards.add(new Card(CardValue.C2));
    allCards.add(new Card(CardValue.C3));
    allCards.add(new Card(CardValue.CK));
    allCards.add(new Card(CardValue.CJ));

    playCard(allCards);

    System.out.println("The Array List after user input: ");
    for (Card card : allCards) {
        System.out.print(card.getValue() + " ");
    }

    private void playCard(List<Card> allCards) {
        final Scanner scanner = new Scanner(System.in);
        final String i = scanner.nextLine();
        scanner.close();

        final CardValue cardValue = CardValue.getCardValue(i);
        final Optional<Card> foundCard = allCards.stream().filter(c -> c.getValue() == cardValue).findAny();

        if (foundCard.isPresent()) {
            allCards.remove(foundCard.get());
        } else {
            throw new IllegalArgumentException("You have no card with value " + i);
        }

    }

    private class Card {
        private final CardValue value;

        private Card(CardValue value) {
            this.value = value;
        }

        private CardValue getValue() {
            return value;
        }

    }

    private enum CardValue {
        C2("2"),
        C3("3"),
        // all other values ...
        CJ("j"),
        CK("k");

        private final String value;

        CardValue(String value) {
            this.value = value;
        }

        public CardValue getCardValue(String value) {
            for (CardValue c : CardValue.values()) {
                if (c.value.equals(value.toLowerCase().substring(0, 1))) {
                    return c;
                }
            }
            throw new IllegalArgumentException("Illegal card value " + value);
        }
    }

玩得开心!

您可以使用Collection.removeIf

allCards.removeIf(obj -> obj instanceof Integer);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM