Iterating through a string word by word
When you do -
for word in string:
You are not iterating through the words in the string, you are iterating through the characters in the string. To iterate through the words, you would first need to split the string into words , using str.split()
, and then iterate through that . Example -
my_string = "this is a string"
for word in my_string.split():
print (word)
Please note, str.split()
, without passing any arguments splits by all whitespaces (space, multiple spaces, tab, newlines, etc).
What is the easiest/best/most correct way to iterate through the characters of a string in Java?
I use a for loop to iterate the string and use charAt()
to get each character to examine it. Since the String is implemented with an array, the charAt()
method is a constant time operation.
String s = "...stuff...";
for (int i = 0; i < s.length(); i++){
char c = s.charAt(i);
//Process char
}
That's what I would do. It seems the easiest to me.
As far as correctness goes, I don't believe that exists here. It is all based on your personal style.
Most efficient way to iterate over words in a string
In most cases, copying represents a very small percentage of the overall costs, so having a clean, highly readable code becomes more important. In rare cases when the time profiler tells you that copying creates a bottleneck, you can iterate over characters in the string with some help from the standard library.
One approach that you could take is to iterate with std::string::find_first_of
and std::string::find_first_not_of
member functions, like this:
const std::string s = "quick \t\t brown \t fox jumps over the\nlazy dog";
const std::string ws = " \t\r\n";
std::size_t pos = 0;
while (pos != s.size()) {
std::size_t from = s.find_first_not_of(ws, pos);
if (from == std::string::npos) {
break;
}
std::size_t to = s.find_first_of(ws, from+1);
if (to == std::string::npos) {
to = s.size();
}
// If you want an individual word, copy it with substr.
// The code below simply prints it character-by-character:
std::cout << "'";
for (std::size_t i = from ; i != to ; i++) {
std::cout << s[i];
}
std::cout << "'" << std::endl;
pos = to;
}
Demo.
Unfortunately, the code becomes a lot harder to read, so you should avoid this change, or at least postpone it until it becomes requried.
How to iterate through string one word at a time in zsh
In order to see the behavior compatible with Bourne shell, you'd need to set the option SH_WORD_SPLIT
:
setopt shwordsplit # this can be unset by saying: unsetopt shwordsplit
things="one two"
for one_thing in $things; do
echo $one_thing
done
would produce:
one
two
However, it's recommended to use an array for producing word splitting, e.g.,
things=(one two)
for one_thing in $things; do
echo $one_thing
done
You may also want to refer to:
3.1: Why does $var where var="foo bar" not do what I expect?
Related Topics
Opencv Imread(Filename) Fails in Debug Mode When Using Release Libraries
What Is a Lambda Expression in C++11
Do the Parentheses After the Type Name Make a Difference With New
Easiest Way to Convert Int to String in C++
When Should You Use a Class VS a Struct in C++
Post-Increment and Pre-Increment Concept
Why Is My Power Operator (^) Not Working
Order of Evaluation of Arguments Using Std::Cout
C++ Extract Number from the Middle of a String
Where Do I Find the Current C or C++ Standard Documents
How to Print a Double Value With Full Precision Using Cout
What Are the Main Purposes of Using Std::Forward and Which Problems It Solves