Как проверить, содержит ли String[] мой элемент?

Меня попросили написать код, который добавляет элементы в массив с несколькими условиями. Я искал по всему StackOverflow, чтобы узнать, как найти элемент в массиве, но все выдают ошибки, поэтому я предполагаю, что что-то не так с моим кодом, и я не могу понять, что. Любая помощь приветствуется.

public class WordList
{
    String [] words;
    int count = 0;
    int max = 2;

    WordList()
    {
        words = new String[max];
        this.words = words;
        this.count = count;
    }

    public static void main (String[] args)
    {
        WordList w1 = new WordList();
        System.out.println(w1.addWord("Dog"));
        System.out.println(w1.addWord("Cat"));
        System.out.println(w1.addWord("Fish"));
    }

    public int addWord(String newWord)
    {

        for(int i = 0; i < words.length; i++)
        {
            if (words.contains(newWord) == false && words.length < max)
            {
                words[i] = newWord;
            }
            else if (words.contains(newWord) == false && words.length == max)
            {
                max *= 2;
                words[i] = newWord;
            }



            count = i + 1;
        }
        return count;
    }

Если вы получили сообщение об ошибке, поделитесь им

Jens 05.02.2019 11:11

вы не можете вызвать метод для массива, я думаю, вы хотите использовать ArrayListgeeksforgeeks.org/array-vs-arraylist-in-java

Jens 05.02.2019 11:12

Я думаю, что вам нужны ArrayLists... Массивы по умолчанию, не имеют этих хороших методов. beginnersbook.com/2013/12/java-массив

WetWer 05.02.2019 11:12
max *= 2; просто к вашему сведению, это не изменит размер массива. Вам также потребуется перераспределить его.
Federico klez Culloca 05.02.2019 11:12

Потому что слова String[] не будут иметь этого метода. пожалуйста, используйте любую коллекцию

Maharjun M 05.02.2019 11:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
5
124
6

Ответы 6

Я думаю, это то, что вы пытаетесь сделать. Обычные массивы не имеют метода indexOf или contains. Вам нужно использовать Arrays (убедитесь, что вы его тоже импортируете)

public int addWord(String newWord)
{
  List <String> myList = Arrays.asList(words);

    for(int i = 0; i < words.length; i++)
    {
        if (myList.indexOf(newWord) == -1 && words.length < max)
        {
            words[i] = newWord;
        }
        else if (myList.indexOf(newWord) == -1 && words.length == max)
        {
            max *= 2;
            words[i] = newWord;
        }

        count = i + 1;
    }
    return count;
}

Зачем каждый раз преобразовывать массив в список? У него лучшая производительность, если оператор использует список во всей программе.

Jens 05.02.2019 11:15

@jens Ты прав.

ninesalt 05.02.2019 11:18

Я думаю, вы могли бы использовать Set вместо массива.

public class WordList {

    private final Set<String> words = new HashSet<>();

    public int addWord(String word) {
        if (word != null)
            words.add(word);
        return words.size();
    }

    public static void main(String[] args) {
        WordList w1 = new WordList();
        System.out.println(w1.addWord("Dog"));
        System.out.println(w1.addWord("Cat"));
        System.out.println(w1.addWord("Fish"));
    }
}

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

Arrays.asList(words).contains(newWord);

В противном случае вы можете использовать поток для поиска элемента.

Arrays.stream(words).anyMatch(newWord::equals);

Я думаю, вы ищете что-то вроде этого решения, но здесь используется ArrayList, а не Array. У массивов нет метода contains по умолчанию, и вам нужно будет реализовать свой собственный метод.

import java.util.ArrayList;
import java.util.List;

public class WordList {
    private static List<String> words = new ArrayList<>();

    public void addWord(String word) {
        if (!words.contains(word)) {
            words.add(word);
        }
    }

    public static List<String> getWords() {
        return words;
    }

    public static void main(String... args) {
        WordList instance = new WordList();
        instance.addWord("Dog");
        instance.addWord("Cat");
        instance.addWord("Fish");

        System.out.println(instance.getWords());
    }
}
import java.util.HashSet;
import java.util.Set;

public class WordList {

    private final Set<String> words = new HashSet<>();

    public static void main(String[] args) {
        WordList w1 = new WordList();
        System.out.println(w1.addWord("Dog"));
        System.out.println(w1.addWord("Cat"));
        System.out.println(w1.addWord("Fish"));
    }

    public int addWord(String word) {
        words.add(word);
        return words.size();
    }

}

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

Federico klez Culloca 05.02.2019 11:36

Ошибка была в words.contains(newWord)

cannot find symbol symbol: method contains(String) location: variable words of type String[]

Это может быть решено путем изменения кода -

Arrays.asList(words).contains(newWord) вместо words.contains(newWord).

Помните, что вам нужно будет импортировать java.util.Arrays

Полный код -

import java.util.Arrays;

/**
 *
 * @author pronet
 */
public class WordList
{
    String [] words;
    int count = 0;
    int max = 2;

    WordList()
    {
        words = new String[max];
        this.words = words;
        this.count = count;
    }

    public static void main (String[] args)
    {
        WordList w1 = new WordList();
        System.out.println(w1.addWord("Dog"));
        System.out.println(w1.addWord("Cat"));
        System.out.println(w1.addWord("Fish"));
    }

    public int addWord(String newWord)
    {
        for(int i = 0; i < words.length; i++)
        {
            if (Arrays.asList( words ).contains(newWord) == false && words.length < max)
            {
                words[i] = newWord;
            }
            else if (Arrays.asList( words ).contains(newWord) == false && words.length == max)
            {
                max *= 2;
                words[i] = newWord;
            }
            count = i + 1;
        }
        return count;
    }
 }

Надеюсь, это поможет вам.

Другие вопросы по теме