Here is the thing. I have a character array as follows..
char[] modes = new char[] { 'm', 'q', 'h', 'y' };
Now I want to provide the user with the option to enter a character. If it exists in the modes
array, I’ll do the necessary. For that I used…
//to take a character as input
mode = input.next().charAt(0);
//now to check if the array contains the character
boolean ifExists = Arrays.asList(modes).contains(mode);
But strangely ifExists
returns false
.
- Any Ideas where am I doing wrong?
- If this is a bad way of doing it, please suggest a way.
asked Jan 23, 2013 at 16:31
Praveen PugliaPraveen Puglia
5,5475 gold badges34 silver badges68 bronze badges
6
I think it’s Autoboxing – the contains() method takes an object, not a primitive.
If you use Character instead of char it will work:
Character[] modes = new Character[] { 'm', 'q', 'h', 'y' };
//to take a character as input
Character mode = "q123".charAt(0);
//now to check if the array contains the character
boolean ifExists = Arrays.asList(modes).contains(mode);
returns true
answered Jan 23, 2013 at 16:37
4
The Arrays.asList() method is returning a List of char[] and not a List of char like you are expecting. I would recommend using the Arrays.binarySort() method like so:
char[] modes = new char[] { 'm', 'q', 'h', 'y' };
char mode = 'q';
//now to check if the array contains the character
int index = Arrays.binarySearch(modes, mode);
boolean ifExists = index != -1;
System.out.print(ifExists);
answered Jan 23, 2013 at 16:40
Pat BurkePat Burke
5804 silver badges12 bronze badges
4
I didn’t find any problem with your code and try this,
If you use this kind of Colletions then you can do lots of operations using methods available defaultly…
List<Character> l = new ArrayList<Character>();
l.add('a');
l.add('b');
l.add('c');
System.out.println(l.contains('a'));
answered Jan 23, 2013 at 16:41
sunleosunleo
10.4k35 gold badges114 silver badges195 bronze badges
1
You could just convert to a string and then run contains
new String(modes).contains("" + mode);
This should then return true or false for your primitive array
answered Jan 23, 2013 at 16:43
RNJRNJ
15.2k18 gold badges85 silver badges131 bronze badges
3
You could also use String indexOf:
boolean ifExists = new String(modes).indexOf(mode) >= 0;
or
boolean ifExists = "mqhy".indexOf(mode) >= 0;
answered Dec 3, 2018 at 12:19
Варя1998 0 / 0 / 0 Регистрация: 19.06.2018 Сообщений: 13 |
||||
1 |
||||
07.10.2018, 13:12. Показов 6687. Ответов 6 Метки нет (Все метки)
Не могу составить функцию поиска книги в библиотеке. Всегда выводится, “Книга не найдена!”
Где ошибка?
0 |
593 / 913 / 149 Регистрация: 10.08.2015 Сообщений: 4,771 |
|
07.10.2018, 13:27 |
2 |
Ошибка в непонимании объектной модели
0 |
JaponDemon 165 / 108 / 57 Регистрация: 30.08.2018 Сообщений: 357 |
||||
07.10.2018, 13:31 |
3 |
|||
a[i].name= массив чар?
0 |
Варя1998 0 / 0 / 0 Регистрация: 19.06.2018 Сообщений: 13 |
||||
07.10.2018, 13:37 [ТС] |
4 |
|||
А если массив строк?
0 |
165 / 108 / 57 Регистрация: 30.08.2018 Сообщений: 357 |
|
07.10.2018, 13:39 |
5 |
string
Массив типа char
А если массив строк? Что ?
0 |
Варя1998 0 / 0 / 0 Регистрация: 19.06.2018 Сообщений: 13 |
||||
07.10.2018, 13:41 [ТС] |
6 |
|||
У меня есть 2 массива :
0 |
JaponDemon 165 / 108 / 57 Регистрация: 30.08.2018 Сообщений: 357 |
||||
07.10.2018, 13:43 |
7 |
|||
0 |
Few remarks regarding your function:
1.Why do you need the third parameter bool flag
, instead of having it as local variable?
2.If you want to expand an array you should copy the old to a newly allocated and then add the new element, you can not just do: *myArray = element;
3.If you want to iterate through the array length/ size, instead of:
for (int i = 0; i < strlen(*myArray) ; ++i)
pass an additional parameter to your function, that indicates the number of elements in the array.
With std::string
and std::vector
you could do something like:
void check_insert (std::vector<std::string>& v, std::string& c) {
for (auto i = 0; i < v.size(); ++i) {
if (v[i] == c) {
std::cout << "Found!n";
return;
}
}
v.push_back(c);
std::cout << "Inserted!n";
}
поиск символа в массиве Char[]
От: |
Аноним
|
||
Дата: | 20.10.05 11:28 | ||
Оценка: |
Привет всем, подскажите пожалуста, как в массиве char найти символ например “Y”(позицию в массиве);
Спасибо
Re: поиск символа в массиве Char[]
От: | Аноним | ||
Дата: | 20.10.05 11:31 | ||
Оценка: |
И еще, подскажите пожалуйста ссылки по С++ на русскомм и легко читаемы. Если можно Страуструпа не давайте, он есть.
Re[2]: поиск символа в массиве Char[]
От: |
Bell
|
||
Дата: | 20.10.05 11:37 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
Если имеем дело со строкой — strchr. Если с обыкновенным массивом — std::find, например.
А>…Если можно Страуструпа не давайте, он есть. Нет уж, никак нельзя — щас дадим
Любите книгу — источник знаний (с) М.Горький
Re[3]: поиск символа в массиве Char[]
От: | Аноним | ||
Дата: | 20.10.05 11:45 | ||
Оценка: |
А примерчик?
Re: поиск символа в массиве Char[]
От: |
Lexey
|
||
Дата: | 20.10.05 12:36 | ||
Оценка: |
Здравствуйте, <Аноним>, Вы писали:
А>Привет всем, подскажите пожалуста, как в массиве char найти символ например “Y”(позицию в массиве);
memchr или strchr, если массив нуль-терминирован.
… << RSDN@Home 1.1.4 stable rev. 510>>
“Будь достоин победы” (c) 8th Wizard’s rule.
Re[4]: поиск символа в массиве Char[]
От: |
sadomovalex
|
http://sadomovalex.blogspot.com | |
Дата: | 20.10.05 12:55 | ||
Оценка: |
Здравствуйте, Аноним, Вы писали:
А>А примерчик?
char c[] = {'a', 'b', 'c'};
char* p = std::find(c, c + 3, 'b');
“Что не завершено, не сделано вовсе” Гаусс
Re[3]: поиск символа в массиве Char[]
От: |
gear nuke |
||
Дата: | 20.10.05 21:10 | ||
Оценка: |
Здравствуйте, Bell, Вы писали:
B>Если имеем дело со строкой — strchr. Если с обыкновенным массивом — std::find, например.
Не то найдёт:
как в массиве char найти символ например “Y”(позицию в массиве);
char foo[] = "QWERTYUIOPASDFGHJKLZXCVBNM";
int pos = -1; // символ не найден
for ( int i = 0; i < sizeof(foo); i++ )
if ( foo[i] == 'Y' )
{
pos = i;
break;
}
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: поиск символа в массиве Char[]
От: |
Phoenickx |
||
Дата: | 21.10.05 13:06 | ||
Оценка: |
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, Bell, Вы писали:
B>>Если имеем дело со строкой — strchr. Если с обыкновенным массивом — std::find, например.
GN>Не то найдёт
А что именно не то найдет?
Re[5]: поиск символа в массиве Char[]
От: |
gear nuke |
||
Дата: | 21.10.05 13:25 | ||
Оценка: |
Здравствуйте, Phoenickx, Вы писали:
P>А что именно не то найдет?
strchr returns a pointer to the first occurrence of c in str, or NULL if c is not found.
А нужен индекс в массиве.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: поиск символа в массиве Char[]
От: | Аноним | ||
Дата: | 21.10.05 13:34 | ||
Оценка: |
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, Phoenickx, Вы писали:
P>>А что именно не то найдет?
GN>strchr returns a pointer to the first occurrence of c in str, or NULL if c is not found.
GN>А нужен индекс в массиве.
Вы щас человека научите на С программировать в стиле бейска. Ищется указатель, а потом вычисляется разность между найденным значением (если оно не NULL) и адресом массива. Это и будет позиция. Если надо 1-based, то прибавить потом 1.
Re[7]: поиск символа в массиве Char[]
От: |
gear nuke |
||
Дата: | 21.10.05 14:37 | ||
Оценка: |
Здравствуйте, <Аноним>, Вы писали:
А>Вы щас человека научите на С программировать в стиле бейска.
ИМХО стиль бейсика — вызывать где ни попадя библиотечные функции, смысл которых остаётся за кадром.
Я же показал как и почему работает поиск.
А>Ищется указатель, а потом вычисляется разность между найденным значением (если оно не NULL) и адресом массива. Это и будет позиция. Если надо 1-based, то прибавить потом 1.
На x86 это требует лишнюю операцию. Компиляторы это скорее всего нивелируют, но если раелизовать на асме, мой способ компактнее .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[8]: поиск символа в массиве Char[]
От: | Аноним | ||
Дата: | 21.10.05 14:45 | ||
Оценка: |
GN>На x86 это требует лишнюю операцию. Компиляторы это скорее всего нивелируют, но если раелизовать на асме, мой способ компактнее .
Вообще-то, здесь речь не об асме, а о С++. И на каком именно acme? В x86 есть команда scasb, которая вместе с префиксом rep вообще весь этот поиск реализует. (Правда не факт, что в пентюхах scasb будет рабтать быстрее цикла).
Re[9]: поиск символа в массиве Char[]
От: |
gear nuke |
||
Дата: | 21.10.05 15:17 | ||
Оценка: |
Здравствуйте, <Аноним>, Вы писали:
А>Вообще-то, здесь речь не об асме, а о С++.
Не я первый поднял вопрос о других языках .
А>И на каком именно acme? В x86 есть команда scasb, которая вместе с префиксом rep вообще весь этот поиск реализует.
rep scasb в этой задаче использовать не получится.
А>(Правда не факт, что в пентюхах scasb будет рабтать быстрее цикла).
Хорошее замечание, только забыли, что пеньтюхов много разных бывает .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[10]: поиск символа в массиве Char[]
От: | Аноним | ||
Дата: | 21.10.05 15:19 | ||
Оценка: |
GN>rep scasb в этой задаче использовать не получится.
Почему не получится ?
Re[11]: поиск символа в массиве Char[]
От: |
gear nuke |
||
Дата: | 21.10.05 16:10 | ||
Оценка: |
Здравствуйте, <Аноним>, Вы писали:
GN>>rep scasb в этой задаче использовать не получится.
А>Почему не получится ?
Что загружать в ecx?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[12]: поиск символа в массиве Char[]
От: | Аноним | ||
Дата: | 21.10.05 16:22 | ||
Оценка: |
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, <Аноним>, Вы писали:
GN>>>rep scasb в этой задаче использовать не получится.
А>>Почему не получится ?
GN>Что загружать в ecx?
да, согласен. Паскаль рулит (в смысле хранение длины строки в ее начале)
Re[13]: поиск символа в массиве Char[]
От: | Аноним | ||
Дата: | 21.10.05 16:24 | ||
Оценка: |
+1 |
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, gear nuke, Вы писали:
GN>>Здравствуйте, <Аноним>, Вы писали:
GN>>>>rep scasb в этой задаче использовать не получится.
А>>>Почему не получится ?
GN>>Что загружать в ecx?
А>да, согласен. Паскаль рулит (в смысле хранение длины строки в ее начале)
Хотя может и не согласен. Изначально спрашивали про поиск в массиве, а не в строке. А размер массива очевидно известен, его в ecx и загрузим
Re[13]: поиск символа в массиве Char[]
От: |
gear nuke |
||
Дата: | 21.10.05 17:15 | ||
Оценка: |
Здравствуйте, <Аноним>, Вы писали:
А>Паскаль рулит (в смысле хранение длины строки в ее начале)
Отец Паскаля уже так не считает .
Component Pascal Language Report:
6.6 String Types
Values of a string type are sequences of characters terminated by a null character (0X). The length of a string is the number of characters it contains excluding the null character.
Strings are either constants or stored in an array of character type. There are no predeclared identifiers for string types because there is no need to use them in a declaration.
Constant strings which consist solely of characters in the range 0X..0FFX and strings stored in an array of SHORTCHAR are of type Shortstring, all others are of type String.
(стандартный CHAR двубайтный)
В общем-то логично — приходится иметь дело с API требующими 0 в конце строки. В одном проекте мне пришлось использовать fucked string, как раз по этой причине . Хотя длина хранится из других соображений — используется как в некотором роде хэш.
P.S. Строчки до сих пор остаются слабым звеном всего ПО — только что копировал 200 строк из таблицы OpenOffice в Janus — ждал 2 секунды
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[14]: поиск символа в массиве Char[]
От: |
gear nuke |
||
Дата: | 21.10.05 17:20 | ||
Оценка: |
Здравствуйте, <Аноним>, Вы писали:
А>Хотя может и не согласен. Изначально спрашивали про поиск в массиве, а не в строке. А размер массива очевидно известен, его в ecx и загрузим
Ну вот видите — как легко запутать простыми строчками даже опытного человека . Так что ИМХО всё же лучше начинать изучение строчек руками, безо всяких функций, тогда и для конкретной жизненной задачи можно будет найти оптимальное решение.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.
Я пытаюсь написать функцию, которая ищет char *
элемент в массиве char*
и функция start проверяет этот элемент, если элемент существует в массиве, который я «найду», в противном случае его следует «вставить» и добавить элемент в массив.
Я написал этот код, но я не знаю, как его попробовать, программа всегда дает мне исключение, что я могу сделать, чтобы проверить элемент в моем массиве указателей?
void checkFunction(char*myArray[], char *element,bool flag)
{
for (int i = 0; i < strlen(*myArray) ; ++i)
{
if (myArray[i] == element)
{
flag = true;
}
}
*myArray = element;
flag = false;
if (flag)
{
cout << "Found" << endl;
}
else
{
cout << "Inserted" << endl;
}
}
0
Решение
C ++ Way
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, const char * argv[]) {
vector<string> myStrings { "One", "Two", "Three" };
// std::find() finds the first element that matches a value
auto it = find(begin(myStrings), end(myStrings), "Twooo");
if (it != end(myStrings)) {
cout << "We found this string; do something..." << endl;
}}
2
Другие решения
Несколько замечаний относительно вашей функции:
1. Зачем вам нужен третий параметр bool flag
вместо того, чтобы иметь его в качестве локальной переменной?
2. Если вы хотите расширить массив, вы должны скопировать старый в недавно выделенный, а затем добавить новый элемент, вы не можете просто сделать: *myArray = element;
3. Если вы хотите выполнить итерацию по длине / размеру массива, вместо:
for (int i = 0; i < strlen(*myArray) ; ++i)
передать в вашу функцию дополнительный параметр, который указывает количество элементов в массиве.
С std::string
а также std::vector
Вы могли бы сделать что-то вроде:
void check_insert (std::vector<std::string>& v, std::string& c) {
for (auto i = 0; i < v.size(); ++i) {
if (v[i] == c) {
std::cout << "Found!n";
return;
}
}
v.push_back(c);
std::cout << "Inserted!n";
}
0