Search a list: Difference between revisions

From Rosetta Code
Content added Content deleted
m (syntax highlighting fixup automation)
Line 22: Line 22:
{{trans|Python}}
{{trans|Python}}


<lang 11l>V haystack = [‘Zig’, ‘Zag’, ‘Wally’, ‘Ronald’, ‘Bush’, ‘Krusty’, ‘Charlie’, ‘Bush’, ‘Bozo’]
<syntaxhighlight lang="11l">V haystack = [‘Zig’, ‘Zag’, ‘Wally’, ‘Ronald’, ‘Bush’, ‘Krusty’, ‘Charlie’, ‘Bush’, ‘Bozo’]


L(needle) (‘Washington’, ‘Bush’)
L(needle) (‘Washington’, ‘Bush’)
Line 28: Line 28:
print(haystack.index(needle)‘ ’needle)
print(haystack.index(needle)‘ ’needle)
X.catch ValueError
X.catch ValueError
print(needle‘ is not in haystack’)</lang>
print(needle‘ is not in haystack’)</syntaxhighlight>


{{out}}
{{out}}
Line 37: Line 37:


=={{header|ACL2}}==
=={{header|ACL2}}==
<lang lisp>(defun index-of-r (e xs i)
<syntaxhighlight lang="lisp">(defun index-of-r (e xs i)
(cond ((endp xs) nil)
(cond ((endp xs) nil)
((equal e (first xs)) i)
((equal e (first xs)) i)
Line 43: Line 43:


(defun index-of (e xs)
(defun index-of (e xs)
(index-of-r e xs 0))</lang>
(index-of-r e xs 0))</syntaxhighlight>


=={{header|Action!}}==
=={{header|Action!}}==
<lang Action!>DEFINE PTR="CARD"
<syntaxhighlight lang="action!">DEFINE PTR="CARD"


INT FUNC Search(PTR ARRAY texts INT count CHAR ARRAY text)
INT FUNC Search(PTR ARRAY texts INT count CHAR ARRAY text)
Line 85: Line 85:
Test(texts,7,"Thursday")
Test(texts,7,"Thursday")
Test(texts,7,"Weekend")
Test(texts,7,"Weekend")
RETURN</lang>
RETURN</syntaxhighlight>
{{out}}
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Search_a_list.png Screenshot from Atari 8-bit computer]
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Search_a_list.png Screenshot from Atari 8-bit computer]
Line 97: Line 97:
=={{header|ActionScript}}==
=={{header|ActionScript}}==
===Using the built-in Error class===
===Using the built-in Error class===
<lang ActionScript>var list:Vector.<String> = Vector.<String>(["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"]);
<syntaxhighlight lang="actionscript">var list:Vector.<String> = Vector.<String>(["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"]);
function lowIndex(listToSearch:Vector.<String>, searchString:String):int
function lowIndex(listToSearch:Vector.<String>, searchString:String):int
{
{
Line 112: Line 112:
throw new Error("String not found: " + searchString);
throw new Error("String not found: " + searchString);
return index;
return index;
}</lang>
}</syntaxhighlight>


===Using a custom error===
===Using a custom error===
In StringNotFoundError.as:
In StringNotFoundError.as:
<lang ActionScript>package {
<syntaxhighlight lang="actionscript">package {
public class StringNotFoundError extends Error {
public class StringNotFoundError extends Error {
public function StringNotFoundError(message:String) {
public function StringNotFoundError(message:String) {
Line 122: Line 122:
}
}
}
}
}</lang>
}</syntaxhighlight>
In a separate file:
In a separate file:
<lang ActionScript>import StringNotFoundError;
<syntaxhighlight lang="actionscript">import StringNotFoundError;
var list:Vector.<String> = Vector.<String>(["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"]);
var list:Vector.<String> = Vector.<String>(["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"]);
function lowIndex(listToSearch:Vector.<String>, searchString:String):int
function lowIndex(listToSearch:Vector.<String>, searchString:String):int
Line 141: Line 141:
return index;
return index;
}
}
</syntaxhighlight>
</lang>


=={{header|Ada}}==
=={{header|Ada}}==
<lang ada>with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
<syntaxhighlight lang="ada">with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Text_IO; use Ada.Text_IO;


Line 185: Line 185:
Check ("Washington");
Check ("Washington");
Check ("Bush");
Check ("Bush");
end Test_List_Index;</lang>
end Test_List_Index;</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 193: Line 193:


=={{header|Aime}}==
=={{header|Aime}}==
<lang aime>void
<syntaxhighlight lang="aime">void
search(list l, text s)
search(list l, text s)
{
{
Line 219: Line 219:


return 0;
return 0;
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>Bush is at 4
<pre>Bush is at 4
Line 231: Line 231:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of FORMATted transput}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of FORMATted transput}}
<lang algol68> FORMAT hay stack := $c("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo")$;
<syntaxhighlight lang="algol68"> FORMAT hay stack := $c("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo")$;
FILE needle exception; STRING ref needle;
FILE needle exception; STRING ref needle;
Line 254: Line 254:
end on value error: reset(needle exception)
end on value error: reset(needle exception)
OD
OD
)</lang>
)</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 266: Line 266:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of FORMATted transput}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of FORMATted transput}}
<lang algol68> []STRING hay stack = ("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo");
<syntaxhighlight lang="algol68"> []STRING hay stack = ("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo");
PROC index = ([]STRING hay stack, STRING needle)INT:(
PROC index = ([]STRING hay stack, STRING needle)INT:(
Line 293: Line 293:
FI
FI
OD
OD
)</lang>
)</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 301: Line 301:


=={{header|Arturo}}==
=={{header|Arturo}}==
<lang rebol>haystack: [Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo]
<syntaxhighlight lang="rebol">haystack: [Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo]


loop [Bush Washington] 'needle [
loop [Bush Washington] 'needle [
Line 308: Line 308:
if? empty? i -> panic ~"|needle| is not in haystack"
if? empty? i -> panic ~"|needle| is not in haystack"
else -> print [i needle]
else -> print [i needle]
]</lang>
]</syntaxhighlight>


{{out}}
{{out}}
Line 316: Line 316:


=={{header|AutoHotkey}}==
=={{header|AutoHotkey}}==
<lang AutoHotkey>haystack = Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo
<syntaxhighlight lang="autohotkey">haystack = Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo
needle = bush, washington
needle = bush, washington
Loop, Parse, needle, `,
Loop, Parse, needle, `,
Line 324: Line 324:
Else
Else
MsgBox % A_LoopField . " not in haystack"
MsgBox % A_LoopField . " not in haystack"
}</lang>
}</syntaxhighlight>


=={{header|AWK}}==
=={{header|AWK}}==
Line 332: Line 332:
In the following implementation we can reach the strings by numeric index with the array <code>haystack_byorder</code> (so, e.g. <code>haystack_byorder[4]</code> gives Bush), and know the "position" of the needle (if it exists) using it as string index for the array <code>haystack</code>, as example does. ('''Beware''': this method does not work when there are duplicates!)
In the following implementation we can reach the strings by numeric index with the array <code>haystack_byorder</code> (so, e.g. <code>haystack_byorder[4]</code> gives Bush), and know the "position" of the needle (if it exists) using it as string index for the array <code>haystack</code>, as example does. ('''Beware''': this method does not work when there are duplicates!)


<lang awk>#! /usr/bin/awk -f
<syntaxhighlight lang="awk">#! /usr/bin/awk -f
BEGIN {
BEGIN {
# create the array, using the word as index...
# create the array, using the word as index...
Line 352: Line 352:
print "Washington is not here";
print "Washington is not here";
}
}
}</lang>
}</syntaxhighlight>


=={{header|BASIC}}==
=={{header|BASIC}}==
{{works with|QBasic}}
{{works with|QBasic}}


<lang qbasic>DATA foo, bar, baz, quux, quuux, quuuux, bazola, ztesch, foo, bar, thud, grunt
<syntaxhighlight lang="qbasic">DATA foo, bar, baz, quux, quuux, quuuux, bazola, ztesch, foo, bar, thud, grunt
DATA foo, bar, bletch, foo, bar, fum, fred, jim, sheila, barney, flarp, zxc
DATA foo, bar, bletch, foo, bar, fum, fred, jim, sheila, barney, flarp, zxc
DATA spqr, wombat, shme, foo, bar, baz, bongo, spam, eggs, snork, foo, bar
DATA spqr, wombat, shme, foo, bar, baz, bongo, spam, eggs, snork, foo, bar
Line 385: Line 385:
EXIT DO
EXIT DO
END IF
END IF
LOOP</lang>
LOOP</syntaxhighlight>


{{out}}
{{out}}
Line 410: Line 410:


==={{header|IS-BASIC}}===
==={{header|IS-BASIC}}===
<lang IS-BASIC>100 PROGRAM "Search.bas"
<syntaxhighlight lang="is-basic">100 PROGRAM "Search.bas"
110 STRING A$(1 TO 55)*8
110 STRING A$(1 TO 55)*8
120 FOR I=1 TO 55
120 FOR I=1 TO 55
Line 426: Line 426:
240 LOOP
240 LOOP
250 DATA foo,bar,baz,quux,quuux,quuuux,bazola,ztesch,foo,bar,thud,grunt,foo,bar,bletch,foo,bar,fum,fred,jim,sheila,barney,flarp,zxc
250 DATA foo,bar,baz,quux,quuux,quuuux,bazola,ztesch,foo,bar,thud,grunt,foo,bar,bletch,foo,bar,fum,fred,jim,sheila,barney,flarp,zxc
260 DATA spqr,wombat,shme,foo,bar,baz,bongo,spam,eggs,snork,foo,bar,zot,blarg,wibble,toto,titi,tata,tutu,pippo,pluto,paperino,aap,noot,mies,oogle,foogle,boogle,zork,gork,bork</lang>
260 DATA spqr,wombat,shme,foo,bar,baz,bongo,spam,eggs,snork,foo,bar,zot,blarg,wibble,toto,titi,tata,tutu,pippo,pluto,paperino,aap,noot,mies,oogle,foogle,boogle,zork,gork,bork</syntaxhighlight>


=={{header|Batch File}}==
=={{header|Batch File}}==
The index of this simple implementation is 1-based. The "haystack" data are borrowed from the [[Search_a_list#BASIC|BASIC]] implementation.
The index of this simple implementation is 1-based. The "haystack" data are borrowed from the [[Search_a_list#BASIC|BASIC]] implementation.
<lang dos>@echo off
<syntaxhighlight lang="dos">@echo off
setlocal enabledelayedexpansion
setlocal enabledelayedexpansion


Line 469: Line 469:
%==We are done==%
%==We are done==%
echo.
echo.
pause</lang>
pause</syntaxhighlight>
{{Out}}
{{Out}}
<pre>"foo": Found 6 times. First instance:[1] Last instance:[35].
<pre>"foo": Found 6 times. First instance:[1] Last instance:[35].
Line 481: Line 481:
=={{header|BBC BASIC}}==
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
{{works with|BBC BASIC for Windows}}
<lang bbcbasic> DIM haystack$(27)
<syntaxhighlight lang="bbcbasic"> DIM haystack$(27)
haystack$() = "alpha","bravo","charlie","delta","echo","foxtrot","golf", \
haystack$() = "alpha","bravo","charlie","delta","echo","foxtrot","golf", \
\ "hotel","india","juliet","kilo","lima","mike","needle", \
\ "hotel","india","juliet","kilo","lima","mike","needle", \
Line 501: Line 501:
ELSE
ELSE
ERROR 100, "Not found"
ERROR 100, "Not found"
ENDIF</lang>
ENDIF</syntaxhighlight>


=={{header|BQN}}==
=={{header|BQN}}==
Line 509: Line 509:
The given <code>IndexOf</code> function is written to satisfy question requirements (throwing exceptions), and it is not recommended for use in production.
The given <code>IndexOf</code> function is written to satisfy question requirements (throwing exceptions), and it is not recommended for use in production.


<lang bqn>list ← ⟨"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"⟩
<syntaxhighlight lang="bqn">list ← ⟨"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"⟩


IndexOf ← {
IndexOf ← {
Line 518: Line 518:
•Show list ⊐ "Wally"‿"Hi" # intended
•Show list ⊐ "Wally"‿"Hi" # intended
•Show list IndexOf "Wally"
•Show list IndexOf "Wally"
list IndexOf "Hi"</lang><lang>⟨ 2 10 ⟩
list IndexOf "Hi"</syntaxhighlight><syntaxhighlight lang="text">⟨ 2 10 ⟩
2
2
! "Error: 'Hi' Not found in list"
! "Error: 'Hi' Not found in list"
Line 526: Line 526:


list IndexOf "Hi"
list IndexOf "Hi"
^^^^^^^</lang>
^^^^^^^</syntaxhighlight>


=={{header|Bracmat}}==
=={{header|Bracmat}}==
For both subtasks, pattern matching is used. The second subtasks proceeds in two steps. First, the first word that occurs twice is found (if it exists). Then, the last occurrence of this word is found using forced backtracking (see the <code>~</code> node) until failure.
For both subtasks, pattern matching is used. The second subtasks proceeds in two steps. First, the first word that occurs twice is found (if it exists). Then, the last occurrence of this word is found using forced backtracking (see the <code>~</code> node) until failure.
<lang Bracmat>( return the largest index to a needle that has multiple
<syntaxhighlight lang="bracmat">( return the largest index to a needle that has multiple
occurrences in the haystack and print the needle
occurrences in the haystack and print the needle
: ?list
: ?list
Line 552: Line 552:
| out$"No word occurs more than once."
| out$"No word occurs more than once."
)
)
);</lang>
);</syntaxhighlight>
{{out}}
{{out}}
<pre>The word 'haystack' occurs at 1-based index 14
<pre>The word 'haystack' occurs at 1-based index 14
Line 559: Line 559:
=={{header|Burlesque}}==
=={{header|Burlesque}}==


<lang burlesque>blsq ) {"Zig" "Zag" "Wally" "Bush" "Ronald" "Bush"}"Bush"Fi
<syntaxhighlight lang="burlesque">blsq ) {"Zig" "Zag" "Wally" "Bush" "Ronald" "Bush"}"Bush"Fi
3</lang>
3</syntaxhighlight>


If you want all indices:
If you want all indices:


<lang burlesque>blsq ) {"Zig" "Zag" "Wally" "Bush" "Ronald" "Bush"}{"Bush"==}fI
<syntaxhighlight lang="burlesque">blsq ) {"Zig" "Zag" "Wally" "Bush" "Ronald" "Bush"}{"Bush"==}fI
{3 5}</lang>
{3 5}</syntaxhighlight>


=={{header|C}}==
=={{header|C}}==


<lang c>#include <stdio.h>
<syntaxhighlight lang="c">#include <stdio.h>
#include <string.h>
#include <string.h>


Line 608: Line 608:
printf("Last index for Zag: %d\n", search_last_needle("Zag", haystack));
printf("Last index for Zag: %d\n", search_last_needle("Zag", haystack));
return 0;
return 0;
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 618: Line 618:
=={{header|C sharp|C#}}==
=={{header|C sharp|C#}}==


<lang csharp>using System;
<syntaxhighlight lang="csharp">using System;
using System.Collections.Generic;
using System.Collections.Generic;


Line 632: Line 632:
}
}
}
}
}</lang>
}</syntaxhighlight>


=={{header|C++}}==
=={{header|C++}}==
Line 639: Line 639:
The following code shows three different ways to solve the task.
The following code shows three different ways to solve the task.


<lang cpp>#include <string>
<syntaxhighlight lang="cpp">#include <string>
#include <algorithm>
#include <algorithm>
#include <iterator>
#include <iterator>
Line 750: Line 750:
std::cout << "\n=== Word not occuring at all ===\n";
std::cout << "\n=== Word not occuring at all ===\n";
test("Goofy");
test("Goofy");
}</lang>
}</syntaxhighlight>


{{out}} (note that in C++, indices start at 0):
{{out}} (note that in C++, indices start at 0):
Line 782: Line 782:
=== C++11 ===
=== C++11 ===
{{works with|g++ version 4.8.4, clang++ version 3.4| "-std=c++11" }}
{{works with|g++ version 4.8.4, clang++ version 3.4| "-std=c++11" }}
<lang cpp>/* new c++-11 features
<syntaxhighlight lang="cpp">/* new c++-11 features
* list class
* list class
* initialization strings
* initialization strings
Line 895: Line 895:
} // main
} // main


/* end */</lang>
/* end */</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 905: Line 905:


=={{header|Ceylon}}==
=={{header|Ceylon}}==
<lang ceylon>shared test void searchAListTask() {
<syntaxhighlight lang="ceylon">shared test void searchAListTask() {
value haystack = [
value haystack = [
"Zig", "Zag", "Wally", "Ronald", "Bush",
"Zig", "Zag", "Wally", "Ronald", "Bush",
Line 915: Line 915:
assertEquals(firstIdx, 4);
assertEquals(firstIdx, 4);
assertEquals(lastIdx, 7);
assertEquals(lastIdx, 7);
}</lang>
}</syntaxhighlight>


=={{header|Clojure}}==
=={{header|Clojure}}==
<lang clojure>(let [haystack ["Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Bozo"]]
<syntaxhighlight lang="clojure">(let [haystack ["Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Bozo"]]
(let [idx (.indexOf haystack "Zig")]
(let [idx (.indexOf haystack "Zig")]
(if (neg? idx)
(if (neg? idx)
(throw (Error. "item not found."))
(throw (Error. "item not found."))
idx)))</lang>
idx)))</syntaxhighlight>


Extra credit: Since Clojure vectors implement java.util.List, you can switch .indexOf for .lastIndexOf to find the highest index of your value.
Extra credit: Since Clojure vectors implement java.util.List, you can switch .indexOf for .lastIndexOf to find the highest index of your value.


=={{header|CLU}}==
=={{header|CLU}}==
<lang clu>% Search an indexable, ordered collection.
<syntaxhighlight lang="clu">% Search an indexable, ordered collection.
% The collection needs to provide `indexes' and `fetch';
% The collection needs to provide `indexes' and `fetch';
% the element type needs to provide `equal'.
% the element type needs to provide `equal'.
Line 958: Line 958:
end
end
end
end
end start_up</lang>
end start_up</syntaxhighlight>
{{out}}
{{out}}
<pre>Ronald: 4
<pre>Ronald: 4
Line 966: Line 966:


=={{header|COBOL}}==
=={{header|COBOL}}==
<lang cobol>*> This is written to COBOL85, which does not include exceptions.
<syntaxhighlight lang="cobol">*> This is written to COBOL85, which does not include exceptions.
IDENTIFICATION DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID. Search-List.
PROGRAM-ID. Search-List.
Line 1,028: Line 1,028:
DISPLAY "Found last of " needle " at " haystack-index "."
DISPLAY "Found last of " needle " at " haystack-index "."
END-IF
END-IF
.</lang>
.</syntaxhighlight>


{{out}}
{{out}}
Line 1,038: Line 1,038:


=={{header|Common Lisp}}==
=={{header|Common Lisp}}==
<lang lisp>(let ((haystack '(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo)))
<syntaxhighlight lang="lisp">(let ((haystack '(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo)))
(dolist (needle '(Washington Bush))
(dolist (needle '(Washington Bush))
(let ((index (position needle haystack)))
(let ((index (position needle haystack)))
(if index
(if index
(progn (print index) (princ needle))
(progn (print index) (princ needle))
(progn (print needle) (princ "is not in haystack"))))))</lang>
(progn (print needle) (princ "is not in haystack"))))))</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,050: Line 1,050:
</pre>
</pre>
The position function solves this task elegantly.
The position function solves this task elegantly.
<lang lisp>
<syntaxhighlight lang="lisp">
CL-USER> (defparameter *list* '(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo))
CL-USER> (defparameter *list* '(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo))
*LIST*
*LIST*
Line 1,058: Line 1,058:
7
7
CL-USER> (position 'Washington *list*)
CL-USER> (position 'Washington *list*)
NIL</lang>
NIL</syntaxhighlight>


=={{header|D}}==
=={{header|D}}==
<lang d>import std.algorithm, std.range, std.string;
<syntaxhighlight lang="d">import std.algorithm, std.range, std.string;


auto firstIndex(R, T)(R hay, T needle) {
auto firstIndex(R, T)(R hay, T needle) {
Line 1,078: Line 1,078:
assert(firstIndex(h, "Bush") == 4);
assert(firstIndex(h, "Bush") == 4);
assert(lastIndex(h, "Bush") == 7);
assert(lastIndex(h, "Bush") == 7);
}</lang>
}</syntaxhighlight>


=={{header|Delphi}}==
=={{header|Delphi}}==


<lang Delphi>program Needle;
<syntaxhighlight lang="delphi">program Needle;


{$APPTYPE CONSOLE}
{$APPTYPE CONSOLE}
Line 1,117: Line 1,117:
list.Free;
list.Free;
end;
end;
end.</lang>
end.</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,126: Line 1,126:
=={{header|DWScript}}==
=={{header|DWScript}}==


<lang Delphi>var haystack : array of String = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"];
<syntaxhighlight lang="delphi">var haystack : array of String = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"];


function Find(what : String) : Integer;
function Find(what : String) : Integer;
Line 1,136: Line 1,136:


PrintLn(Find("Ronald")); // 3
PrintLn(Find("Ronald")); // 3
PrintLn(Find('McDonald')); // exception</lang>
PrintLn(Find('McDonald')); // exception</syntaxhighlight>


=={{header|E}}==
=={{header|E}}==


<lang e>def haystack := ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
<syntaxhighlight lang="e">def haystack := ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]


/** meet the 'raise an exception' requirement */
/** meet the 'raise an exception' requirement */
Line 1,151: Line 1,151:


println(find("Ronald")) # prints 3
println(find("Ronald")) # prints 3
println(find("McDonald")) # will throw</lang>
println(find("McDonald")) # will throw</syntaxhighlight>


=={{header|Elena}}==
=={{header|Elena}}==
ELENA 5.0 :
ELENA 5.0 :
<lang elena>import system'routines;
<syntaxhighlight lang="elena">import system'routines;
import extensions;
import extensions;
Line 1,175: Line 1,175:
}
}
}
}
}</lang>
}</syntaxhighlight>


=={{header|Elixir}}==
=={{header|Elixir}}==
<lang elixir>haystack = ~w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo)
<syntaxhighlight lang="elixir">haystack = ~w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo)


Enum.each(~w(Bush Washington), fn needle ->
Enum.each(~w(Bush Washington), fn needle ->
Line 1,184: Line 1,184:
if index, do: (IO.puts "#{index} #{needle}"),
if index, do: (IO.puts "#{index} #{needle}"),
else: raise "#{needle} is not in haystack\n"
else: raise "#{needle} is not in haystack\n"
end)</lang>
end)</syntaxhighlight>


{{out}}
{{out}}
Line 1,201: Line 1,201:
Erlang lists can be accessed with the function lists:nth/2, which starts at 1 (first element). As such Erlang can be considered 1-indexed for this problem.
Erlang lists can be accessed with the function lists:nth/2, which starts at 1 (first element). As such Erlang can be considered 1-indexed for this problem.
Note that you could set the indexing to 0 by modifying the function call in pos/2.
Note that you could set the indexing to 0 by modifying the function call in pos/2.
<lang erlang>-module(index).
<syntaxhighlight lang="erlang">-module(index).
-export([main/0]).
-export([main/0]).


Line 1,215: Line 1,215:


print({Needle, undefined}) -> io:format("~s is not in haystack.~n",[Needle]);
print({Needle, undefined}) -> io:format("~s is not in haystack.~n",[Needle]);
print({Needle, Pos}) -> io:format("~s at position ~p.~n",[Needle,Pos]).</lang>
print({Needle, Pos}) -> io:format("~s at position ~p.~n",[Needle,Pos]).</syntaxhighlight>


{{out}}
{{out}}
Line 1,229: Line 1,229:
The procedure can be made into a function to search with other strings, take user input and give output of the searched haystack.
The procedure can be made into a function to search with other strings, take user input and give output of the searched haystack.


<lang euphoria>
<syntaxhighlight lang="euphoria">
include std/search.e
include std/search.e
include std/console.e
include std/console.e
Line 1,276: Line 1,276:
--wait for user to press a key to exit
--wait for user to press a key to exit
any_key()
any_key()
</syntaxhighlight>
</lang>


{{out}}
{{out}}
Line 1,308: Line 1,308:


=={{header|F_Sharp|F#}}==
=={{header|F_Sharp|F#}}==
<lang fsharp>List.findIndex (fun x -> x = "bar") ["foo"; "bar"; "baz"; "bar"] // -> 1
<syntaxhighlight lang="fsharp">List.findIndex (fun x -> x = "bar") ["foo"; "bar"; "baz"; "bar"] // -> 1
// A System.Collections.Generic.KeyNotFoundException
// A System.Collections.Generic.KeyNotFoundException
// is raised, if the predicate does not evaluate to
// is raised, if the predicate does not evaluate to
// true for any list element.</lang>
// true for any list element.</syntaxhighlight>


=={{header|Factor}}==
=={{header|Factor}}==
<lang factor>: find-index ( seq elt -- i )
<syntaxhighlight lang="factor">: find-index ( seq elt -- i )
'[ _ = ] find drop [ "Not found" throw ] unless* ; inline
'[ _ = ] find drop [ "Not found" throw ] unless* ; inline


: find-last-index ( seq elt -- i )
: find-last-index ( seq elt -- i )
'[ _ = ] find-last drop [ "Not found" throw ] unless* ; inline</lang>
'[ _ = ] find-last drop [ "Not found" throw ] unless* ; inline</syntaxhighlight>


( scratchpad ) { "a" "b" "c" "d" "c" } "c" find-index .
( scratchpad ) { "a" "b" "c" "d" "c" } "c" find-index .
Line 1,327: Line 1,327:
=={{header|Forth}}==
=={{header|Forth}}==
{{works with|4tH|3.61.5}}
{{works with|4tH|3.61.5}}
<lang forth>include lib/row.4th
<syntaxhighlight lang="forth">include lib/row.4th


create haystack
create haystack
Line 1,337: Line 1,337:
;
;


s" Washington" haystack s" Bush" haystack</lang>
s" Washington" haystack s" Bush" haystack</syntaxhighlight>




Line 1,344: Line 1,344:
Needs the FMS-SI (single inheritance) library code located here:
Needs the FMS-SI (single inheritance) library code located here:
http://soton.mpeforth.com/flag/fms/index.html
http://soton.mpeforth.com/flag/fms/index.html
<lang forth>include FMS-SI.f
<syntaxhighlight lang="forth">include FMS-SI.f
include FMS-SILib.f
include FMS-SILib.f


Line 1,373: Line 1,373:
s" Hillary" haystack LastIndexOf . \ => 7
s" Hillary" haystack LastIndexOf . \ => 7
s" Washington" haystack needleIndex . \ => aborted: Not found
s" Washington" haystack needleIndex . \ => aborted: Not found
</syntaxhighlight>
</lang>


=={{header|Fortran}}==
=={{header|Fortran}}==


<lang fortran>program main
<syntaxhighlight lang="fortran">program main


implicit none
implicit none
Line 1,411: Line 1,411:
end subroutine find_needle
end subroutine find_needle


end program main</lang>
end program main</syntaxhighlight>


=={{header|FreeBASIC}}==
=={{header|FreeBASIC}}==
FreeBASIC doesn't have exceptions so we use a different approach to check if the needle is present or not in the haystack:
FreeBASIC doesn't have exceptions so we use a different approach to check if the needle is present or not in the haystack:
<lang freebasic>' FB 1.05.0 Win64
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64
' Works FB 1.05.0 Linux Mint 64
' Works FB 1.05.0 Linux Mint 64


Line 1,475: Line 1,475:
Print
Print
Print "Press any key to quit"
Print "Press any key to quit"
Sleep</lang>
Sleep</syntaxhighlight>


{{out}}
{{out}}
Line 1,488: Line 1,488:
=={{header|Gambas}}==
=={{header|Gambas}}==
'''[https://gambas-playground.proko.eu/?gist=7729d65f8af3f128db6c6992c5f74e98 Click this link to run this code]'''
'''[https://gambas-playground.proko.eu/?gist=7729d65f8af3f128db6c6992c5f74e98 Click this link to run this code]'''
<lang gambas>Public Sub Main()
<syntaxhighlight lang="gambas">Public Sub Main()
Dim sHaystack As String[] = ["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"]
Dim sHaystack As String[] = ["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"]
Dim sNeedle As String = "Charlie"
Dim sNeedle As String = "Charlie"
Line 1,503: Line 1,503:
Print sOutput
Print sOutput


End</lang>
End</syntaxhighlight>
Output:
Output:
<pre>
<pre>
Line 1,510: Line 1,510:


=={{header|GAP}}==
=={{header|GAP}}==
<lang gap># First position is built-in
<syntaxhighlight lang="gap"># First position is built-in
haystack := Eratosthenes(10000);;
haystack := Eratosthenes(10000);;
needle := 8999;;
needle := 8999;;
Line 1,536: Line 1,536:
# 1
# 1
LastPosition(a, 0);
LastPosition(a, 0);
# 97</lang>
# 97</syntaxhighlight>
See also [[Sieve of Eratosthenes#GAP|Eratosthenes]] and [[Knuth shuffle#GAP|Shuffle]] functions in RosettaCode.
See also [[Sieve of Eratosthenes#GAP|Eratosthenes]] and [[Knuth shuffle#GAP|Shuffle]] functions in RosettaCode.


=={{header|Go}}==
=={{header|Go}}==
Data used by both examples below. (You can give multiple files to go run, like <tt>$ go run data.go example.go</tt>)
Data used by both examples below. (You can give multiple files to go run, like <tt>$ go run data.go example.go</tt>)
<lang go>package main
<syntaxhighlight lang="go">package main


var haystack = []string{"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty",
var haystack = []string{"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty",
Line 1,554: Line 1,554:
"zork", "gork", "bork", "sodium", "phosphorous", "californium",
"zork", "gork", "bork", "sodium", "phosphorous", "californium",
"copernicium", "gold", "thallium", "carbon", "silver", "gold", "copper",
"copernicium", "gold", "thallium", "carbon", "silver", "gold", "copper",
"helium", "sulfur"}</lang>
"helium", "sulfur"}</syntaxhighlight>
===Linear search===
===Linear search===
<lang go>package main
<syntaxhighlight lang="go">package main


import "fmt"
import "fmt"
Line 1,621: Line 1,621:
}
}
return -1
return -1
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,633: Line 1,633:
===Map lookup===
===Map lookup===
More efficient, if you're doing lots of lookups, is to build a map. This example doesn't completely conform to the task but gives the idea that you could store indexes as map values.
More efficient, if you're doing lots of lookups, is to build a map. This example doesn't completely conform to the task but gives the idea that you could store indexes as map values.
<lang go>package main
<syntaxhighlight lang="go">package main


import "fmt"
import "fmt"
Line 1,645: Line 1,645:
fmt.Println(n, m[n])
fmt.Println(n, m[n])
}
}
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 1,654: Line 1,654:


=={{header|Groovy}}==
=={{header|Groovy}}==
<lang groovy>def haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
<syntaxhighlight lang="groovy">def haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
def needles = ["Washington","Bush","Wally"]
def needles = ["Washington","Bush","Wally"]
needles.each { needle ->
needles.each { needle ->
Line 1,666: Line 1,666:
println "Last index: " + lastindex + " " + needle
println "Last index: " + lastindex + " " + needle
}
}
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 1,679: Line 1,679:
=={{header|Haskell}}==
=={{header|Haskell}}==
Libraries and data:
Libraries and data:
<lang haskell>import Data.List
<syntaxhighlight lang="haskell">import Data.List


haystack=["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
haystack=["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
needles = ["Washington","Bush"]</lang>
needles = ["Washington","Bush"]</syntaxhighlight>
I use 'lambda' notation for readability.
I use 'lambda' notation for readability.
:Find 'just' an index:
:Find 'just' an index:
<lang haskell>*Main> map (\x -> (x,elemIndex x haystack)) needles
<syntaxhighlight lang="haskell">*Main> map (\x -> (x,elemIndex x haystack)) needles
[("Washington",Nothing),("Bush",Just 4)]</lang>
[("Washington",Nothing),("Bush",Just 4)]</syntaxhighlight>
Want to know if there are there more Bushes hiding in the haystack?
Want to know if there are there more Bushes hiding in the haystack?
<lang haskell>*Main> map (\x -> (x,elemIndices x haystack)) needles
<syntaxhighlight lang="haskell">*Main> map (\x -> (x,elemIndices x haystack)) needles
[("Washington",[]),("Bush",[4,7])]</lang>
[("Washington",[]),("Bush",[4,7])]</syntaxhighlight>
To be complete. Here is the 'point free' version of the task:
To be complete. Here is the 'point free' version of the task:
<lang haskell>*Main> ((,) <*> flip elemIndex haystack) <$> needles
<syntaxhighlight lang="haskell">*Main> ((,) <*> flip elemIndex haystack) <$> needles
[("Washington",Nothing),("Bush",Just 4)]</lang>
[("Washington",Nothing),("Bush",Just 4)]</syntaxhighlight>


=={{header|HicEst}}==
=={{header|HicEst}}==
<lang HicEst>CHARACTER haystack='Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo.'
<syntaxhighlight lang="hicest">CHARACTER haystack='Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo.'
CHARACTER needle*10
CHARACTER needle*10


Line 1,712: Line 1,712:
WRITE(ClipBoard) "Last ", needle, "found in position ", last
WRITE(ClipBoard) "Last ", needle, "found in position ", last
! Last bush found in position 8
! Last bush found in position 8
ENDIF</lang>
ENDIF</syntaxhighlight>


=={{header|Icon}} and {{header|Unicon}}==
=={{header|Icon}} and {{header|Unicon}}==
<syntaxhighlight lang="icon">
<lang Icon>
link lists
link lists


Line 1,740: Line 1,740:
every i := p!arglist
every i := p!arglist
return \i
return \i
end</lang>
end</syntaxhighlight>


{{libheader|Icon Programming Library}}
{{libheader|Icon Programming Library}}
Taken from the public domain Icon Programming Library's [http://www.cs.arizona.edu/icon/library/src/procs/lists.icn lindex in lists] which generates list indices for x of any type
Taken from the public domain Icon Programming Library's [http://www.cs.arizona.edu/icon/library/src/procs/lists.icn lindex in lists] which generates list indices for x of any type
<lang Icon>procedure lindex(lst, x) #: generate indices for items matching x
<syntaxhighlight lang="icon">procedure lindex(lst, x) #: generate indices for items matching x
local i
local i


Line 1,750: Line 1,750:
if lst[i] === x then suspend i
if lst[i] === x then suspend i


end</lang>
end</syntaxhighlight>


{{out}}
{{out}}
Line 1,769: Line 1,769:
List has a <code>indexOf</code> method which does not raise an exception on lookup failure but returns <code>nil</code> therefore I extend List with a <code>firstIndex</code> method that does raise an exception. I also create a <code>lastIndex</code> extension that finds the last index of a matching object by iterating in reverse over the list. Note that all these methods find any object not just strings.
List has a <code>indexOf</code> method which does not raise an exception on lookup failure but returns <code>nil</code> therefore I extend List with a <code>firstIndex</code> method that does raise an exception. I also create a <code>lastIndex</code> extension that finds the last index of a matching object by iterating in reverse over the list. Note that all these methods find any object not just strings.


<lang Io>NotFound := Exception clone
<syntaxhighlight lang="io">NotFound := Exception clone
List firstIndex := method(obj,
List firstIndex := method(obj,
indexOf(obj) ifNil(NotFound raise)
indexOf(obj) ifNil(NotFound raise)
Line 1,794: Line 1,794:
writeln(needle," is not in haystack")
writeln(needle," is not in haystack")
)pass
)pass
)</lang>
)</syntaxhighlight>
{{out}}
{{out}}
<pre>firstIndex("Washington"): Washington is not in haystack
<pre>firstIndex("Washington"): Washington is not in haystack
Line 1,807: Line 1,807:
For example:
For example:


<lang j> Haystack =: ;:'Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo'
<syntaxhighlight lang="j"> Haystack =: ;:'Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo'
Needles =: ;:'Washington Bush'
Needles =: ;:'Washington Bush'
Line 1,813: Line 1,813:
9 4
9 4
Haystack i: Needles NB. last positions
Haystack i: Needles NB. last positions
9 7</lang>
9 7</syntaxhighlight>


Note that the arguments to <code>i.</code> can be anything (ie either or both may be scalars, lists, multidimensional arrays, etc). Nonmatches get a result of 1+largest valid index.
Note that the arguments to <code>i.</code> can be anything (ie either or both may be scalars, lists, multidimensional arrays, etc). Nonmatches get a result of 1+largest valid index.
Line 1,821: Line 1,821:
<code>e.</code> finds whether items are members of a set, returning a bitmask to select the members:
<code>e.</code> finds whether items are members of a set, returning a bitmask to select the members:


<lang j> Needles e. Haystack
<syntaxhighlight lang="j"> Needles e. Haystack
0 1
0 1
1 2 3 4 5 6 7 8 9 e. 2 3 5 60
1 2 3 4 5 6 7 8 9 e. 2 3 5 60
0 1 1 0 1 0 0 0 0</lang>
0 1 1 0 1 0 0 0 0</syntaxhighlight>


<code>I.</code> finds indices, but performs a binary search (which requires that the list being searched is sorted). This can be useful for finding non-exact matches (the index of the next value is returned for non-exact matches).
<code>I.</code> finds indices, but performs a binary search (which requires that the list being searched is sorted). This can be useful for finding non-exact matches (the index of the next value is returned for non-exact matches).


<lang j> 1 2 3 4 5 6 7 8 9 I. 2 3 5 60 6.66
<syntaxhighlight lang="j"> 1 2 3 4 5 6 7 8 9 I. 2 3 5 60 6.66
1 2 4 9 6
1 2 4 9 6
(;:'eight five four nine one seven six three two') I. ;:'two three five sixty'
(;:'eight five four nine one seven six three two') I. ;:'two three five sixty'
8 7 1 7</lang>
8 7 1 7</syntaxhighlight>


To format output similar to the other examples, one might write:
To format output similar to the other examples, one might write:


<lang j> Haystack ;:^:_1@(] ,. [ ((<'is not in haystack')"_)`(#@[ I.@:= ])`(8!:0@])} i.) Needles
<syntaxhighlight lang="j"> Haystack ;:^:_1@(] ,. [ ((<'is not in haystack')"_)`(#@[ I.@:= ])`(8!:0@])} i.) Needles
Washington is not in haystack
Washington is not in haystack
Bush 4</lang>
Bush 4</syntaxhighlight>


Or broken up into components and defined as a verb/function for finding the last positions:
Or broken up into components and defined as a verb/function for finding the last positions:
<lang j> msg=: (<'is not in haystack')"_ NB. not found message
<syntaxhighlight lang="j"> msg=: (<'is not in haystack')"_ NB. not found message
idxmissing=: #@[ I.@:= ] NB. indices of items not found
idxmissing=: #@[ I.@:= ] NB. indices of items not found
fmtdata=: 8!:0@] NB. format atoms as boxed strings
fmtdata=: 8!:0@] NB. format atoms as boxed strings
Line 1,847: Line 1,847:
Haystack findLastIndex Needles NB. usage
Haystack findLastIndex Needles NB. usage
Washington is not in haystack
Washington is not in haystack
Bush 7</lang>
Bush 7</syntaxhighlight>


To elaborate a bit: Array-oriented languages (like J) consume the input and produce the output ''in toto''.
To elaborate a bit: Array-oriented languages (like J) consume the input and produce the output ''in toto''.
Line 1,865: Line 1,865:
=={{header|Java}}==
=={{header|Java}}==
for Lists, they have an indexOf() method:
for Lists, they have an indexOf() method:
<lang java>import java.util.List;
<syntaxhighlight lang="java">import java.util.List;
import java.util.Arrays;
import java.util.Arrays;


Line 1,876: Line 1,876:
else
else
System.out.println(index + " " + needle);
System.out.println(index + " " + needle);
}</lang>
}</syntaxhighlight>


for arrays, you have to do it manually:
for arrays, you have to do it manually:
<lang java>import java.util.Arrays;
<syntaxhighlight lang="java">import java.util.Arrays;
String[] haystack = { "Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"};
String[] haystack = { "Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"};
Line 1,889: Line 1,889:
else
else
System.out.println(index + " " + needle);
System.out.println(index + " " + needle);
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 1,898: Line 1,898:


=={{header|JavaScript}}==
=={{header|JavaScript}}==
<lang javascript>var haystack = ['Zig', 'Zag', 'Wally', 'Ronald', 'Bush', 'Krusty', 'Charlie', 'Bush', 'Bozo']
<syntaxhighlight lang="javascript">var haystack = ['Zig', 'Zag', 'Wally', 'Ronald', 'Bush', 'Krusty', 'Charlie', 'Bush', 'Bozo']
var needles = ['Bush', 'Washington']
var needles = ['Bush', 'Washington']


Line 1,913: Line 1,913:
else
else
throw needles[i] + " does not appear in the haystack"
throw needles[i] + " does not appear in the haystack"
}</lang>
}</syntaxhighlight>


The following {{works with|JavaScript|1.6}}:
The following {{works with|JavaScript|1.6}}:
<lang javascript>for each (var needle in needles) {
<syntaxhighlight lang="javascript">for each (var needle in needles) {
var idx = haystack.indexOf(needle);
var idx = haystack.indexOf(needle);
if (idx == -1)
if (idx == -1)
Line 1,933: Line 1,933:
break
break
}
}
}</lang>
}</syntaxhighlight>




Or, generalising enough (in ES5) to allow for varying definitions of the type of match we are looking for:
Or, generalising enough (in ES5) to allow for varying definitions of the type of match we are looking for:


<lang JavaScript>(function () {
<syntaxhighlight lang="javascript">(function () {


function findIndex(fnPredicate, list) {
function findIndex(fnPredicate, list) {
Line 1,984: Line 1,984:
})
})
}
}
})();</lang>
})();</syntaxhighlight>


Output:
Output:


<syntaxhighlight lang="javascript">{
<lang JavaScript>{
"first": [
"first": [
[
[
Line 2,009: Line 2,009:
]
]
]
]
}</lang>
}</syntaxhighlight>


=={{header|jq}}==
=={{header|jq}}==
Line 2,016: Line 2,016:


In the following, the output is shown after the "# =>":
In the following, the output is shown after the "# =>":
<syntaxhighlight lang="jq">
<lang jq>
["a","b","c"] | index("b")
["a","b","c"] | index("b")
# => 1
# => 1
Line 2,033: Line 2,033:


["a","b","c","b","d"] | indices("b")[-1]
["a","b","c","b","d"] | indices("b")[-1]
# => 3</lang>
# => 3</syntaxhighlight>


=={{header|Julia}}==
=={{header|Julia}}==
{{works with|Julia|0.6}}
{{works with|Julia|0.6}}


<lang julia>@show findfirst(["no", "?", "yes", "maybe", "yes"], "yes")
<syntaxhighlight lang="julia">@show findfirst(["no", "?", "yes", "maybe", "yes"], "yes")
@show indexin(["yes"], ["no", "?", "yes", "maybe", "yes"])
@show indexin(["yes"], ["no", "?", "yes", "maybe", "yes"])
@show findin(["no", "?", "yes", "maybe", "yes"], ["yes"])
@show findin(["no", "?", "yes", "maybe", "yes"], ["yes"])
@show find(["no", "?", "yes", "maybe", "yes"] .== "yes")</lang>
@show find(["no", "?", "yes", "maybe", "yes"] .== "yes")</syntaxhighlight>


{{out}}
{{out}}
Line 2,050: Line 2,050:


=={{header|K}}==
=={{header|K}}==
<lang K> Haystack:("Zig";"Zag";"Wally";"Ronald";"Bush";"Krusty";"Charlie";"Bush";"Bozo")
<syntaxhighlight lang="k"> Haystack:("Zig";"Zag";"Wally";"Ronald";"Bush";"Krusty";"Charlie";"Bush";"Bozo")
Needles:("Washington";"Bush")
Needles:("Washington";"Bush")
{:[y _in x;(y;x _bin y);(y;"Not Found")]}[Haystack]'Needles </lang>
{:[y _in x;(y;x _bin y);(y;"Not Found")]}[Haystack]'Needles </syntaxhighlight>


{{out}}
{{out}}
<lang K>(("Washington"
<syntaxhighlight lang="k">(("Washington"
"Not Found")
"Not Found")
("Bush"
("Bush"
4))</lang>
4))</syntaxhighlight>


Additional:
Additional:
Line 2,064: Line 2,064:
Here we use the dyadic verb _sm (string match) instead of _bin (binary search).
Here we use the dyadic verb _sm (string match) instead of _bin (binary search).


<lang K> Haystack2: Haystack,,"Bush"
<syntaxhighlight lang="k"> Haystack2: Haystack,,"Bush"
Needles2:Needles,,"Zag"
Needles2:Needles,,"Zag"
{+(x;{:[#&x;,/?(*&x;*|&x);"Not found"]}'+x _sm/:y)}[Needles2;Haystack2]</lang>
{+(x;{:[#&x;,/?(*&x;*|&x);"Not found"]}'+x _sm/:y)}[Needles2;Haystack2]</syntaxhighlight>


{{out}}
{{out}}
<lang K>(("Washington"
<syntaxhighlight lang="k">(("Washington"
"Not found")
"Not found")
("Bush"
("Bush"
4 9)
4 9)
("Zag"
("Zag"
1))</lang>
1))</syntaxhighlight>


=={{header|Kotlin}}==
=={{header|Kotlin}}==
<lang scala>// version 1.0.6 (search_list.kt)
<syntaxhighlight lang="scala">// version 1.0.6 (search_list.kt)


fun main(args: Array<String>) {
fun main(args: Array<String>) {
Line 2,090: Line 2,090:
index = haystack.indexOf(needle)
index = haystack.indexOf(needle)
if (index == -1) throw Exception("$needle does not occur in the list")
if (index == -1) throw Exception("$needle does not occur in the list")
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 2,104: Line 2,104:


=={{header|Lang5}}==
=={{header|Lang5}}==
<lang lang5>: haystack(*) ['rosetta 'code 'search 'a 'list 'lang5 'code] find-index ;
<syntaxhighlight lang="lang5">: haystack(*) ['rosetta 'code 'search 'a 'list 'lang5 'code] find-index ;
: find-index
: find-index
2dup eq length iota swap select swap drop
2dup eq length iota swap select swap drop
Line 2,112: Line 2,112:
: ==>search apply ;
: ==>search apply ;


['hello 'code] 'haystack ==>search .</lang>
['hello 'code] 'haystack ==>search .</syntaxhighlight>
{{out}}
{{out}}
<pre>[ hello is not in haystack
<pre>[ hello is not in haystack
Line 2,121: Line 2,121:
Lasso arrays have a findindex method which returns all matching indexes. [http://lassoguide.com/operations/containers.html?#array]
Lasso arrays have a findindex method which returns all matching indexes. [http://lassoguide.com/operations/containers.html?#array]


<lang Lasso>local(haystack) = array('Zig', 'Zag', 'Wally', 'Ronald', 'Bush', 'Krusty', 'Charlie', 'Bush', 'Bozo')
<syntaxhighlight lang="lasso">local(haystack) = array('Zig', 'Zag', 'Wally', 'Ronald', 'Bush', 'Krusty', 'Charlie', 'Bush', 'Bozo')


#haystack->findindex('Bush')->first // 5
#haystack->findindex('Bush')->first // 5
Line 2,129: Line 2,129:
handle_error => {^ error_msg ^}
handle_error => {^ error_msg ^}
fail_if(not #haystack->findindex('Washington')->first,'Washington is not in haystack.')
fail_if(not #haystack->findindex('Washington')->first,'Washington is not in haystack.')
^}</lang>
^}</syntaxhighlight>


{{out}}
{{out}}
Line 2,138: Line 2,138:


=={{header|Liberty BASIC}}==
=={{header|Liberty BASIC}}==
<lang lb>haystack$="apple orange pear cherry melon peach banana needle blueberry mango strawberry needle "
<syntaxhighlight lang="lb">haystack$="apple orange pear cherry melon peach banana needle blueberry mango strawberry needle "
haystack$=haystack$+"pineapple grape kiwi blackberry plum raspberry needle cranberry apricot"
haystack$=haystack$+"pineapple grape kiwi blackberry plum raspberry needle cranberry apricot"


Line 2,174: Line 2,174:
else
else
print needle$;" found at index ";k
print needle$;" found at index ";k
end if</lang>
end if</syntaxhighlight>


=={{header|Lingo}}==
=={{header|Lingo}}==
<lang lingo>haystack = ["apples", "oranges", "bananas", "oranges"]
<syntaxhighlight lang="lingo">haystack = ["apples", "oranges", "bananas", "oranges"]
needle = "oranges"
needle = "oranges"


Line 2,187: Line 2,187:
end if
end if


-- "needle found at index 2"</lang>
-- "needle found at index 2"</syntaxhighlight>


=={{header|Lisaac}}==
=={{header|Lisaac}}==
<lang Lisaac>+ haystack : ARRAY[STRING];
<syntaxhighlight lang="lisaac">+ haystack : ARRAY[STRING];
haystack := "Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo".split;
haystack := "Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo".split;
"Washington Bush".split.foreach { needle : STRING;
"Washington Bush".split.foreach { needle : STRING;
Line 2,202: Line 2,202:
" is not in haystack\n".print;
" is not in haystack\n".print;
};
};
};</lang>
};</syntaxhighlight>


=={{header|Logo}}==
=={{header|Logo}}==
<lang logo>to indexof :item :list
<syntaxhighlight lang="logo">to indexof :item :list
if empty? :list [(throw "NOTFOUND 0)]
if empty? :list [(throw "NOTFOUND 0)]
if equal? :item first :list [output 1]
if equal? :item first :list [output 1]
Line 2,217: Line 2,217:


showindex "dog [My dog has fleas] ; dog found at position 2 in My dog has fleas
showindex "dog [My dog has fleas] ; dog found at position 2 in My dog has fleas
showindex "cat [My dog has fleas] ; cat not found in My dog has fleas</lang>
showindex "cat [My dog has fleas] ; cat not found in My dog has fleas</syntaxhighlight>


=={{header|Lua}}==
=={{header|Lua}}==
<lang lua>list = {"mouse", "hat", "cup", "deodorant", "television", "soap", "methamphetamine", "severed cat heads"} --contents of my desk
<syntaxhighlight lang="lua">list = {"mouse", "hat", "cup", "deodorant", "television", "soap", "methamphetamine", "severed cat heads"} --contents of my desk


item = io.read()
item = io.read()
Line 2,226: Line 2,226:
for i,v in ipairs(list)
for i,v in ipairs(list)
if v == item then print(i) end
if v == item then print(i) end
end</lang>
end</syntaxhighlight>


=={{header|M2000 Interpreter}}==
=={{header|M2000 Interpreter}}==
Line 2,232: Line 2,232:
Normally we use Exist(inventoryA, "key") and if it is true then we get the value as Eval(inventoryA) without using second search, by temporary use of an index. We can read that index by making a variable to bind a property of COM object (the object under the inventory).
Normally we use Exist(inventoryA, "key") and if it is true then we get the value as Eval(inventoryA) without using second search, by temporary use of an index. We can read that index by making a variable to bind a property of COM object (the object under the inventory).


<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module Checkit {
Module Checkit {
Flush ' empty stack
Flush ' empty stack
Line 2,269: Line 2,269:
}
}
CheckIt
CheckIt
</syntaxhighlight>
</lang>


Extra-Extra: Find all occurrences displaying the indexes for each one.
Extra-Extra: Find all occurrences displaying the indexes for each one.


<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module CheckThis {
Module CheckThis {
Inventory Queue Haystack= "foo", "bar", "baz", "quux", "quuux", "quuuux", "bazola", "ztesch", "foo", "bar", "thud", "grunt"
Inventory Queue Haystack= "foo", "bar", "baz", "quux", "quuux", "quuuux", "bazola", "ztesch", "foo", "bar", "thud", "grunt"
Line 2,299: Line 2,299:
}
}
CheckThis
CheckThis
</syntaxhighlight>
</lang>


=={{header|Maple}}==
=={{header|Maple}}==
<lang Maple>haystack := ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]:
<syntaxhighlight lang="maple">haystack := ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]:
occurences := ListTools:-SearchAll(needle,haystack):
occurences := ListTools:-SearchAll(needle,haystack):
try
try
Line 2,311: Line 2,311:
catch :
catch :
print("Erros: Needle not found in the haystack"):
print("Erros: Needle not found in the haystack"):
end try:</lang>
end try:</syntaxhighlight>
{{Out|Examples}}
{{Out|Examples}}
needle := "Washington":
needle := "Washington":
Line 2,321: Line 2,321:
=={{header|Mathematica}}/{{header|Wolfram Language}}==
=={{header|Mathematica}}/{{header|Wolfram Language}}==
This examples shows you the first appearance, the last appearance, and all appearances (as a list):
This examples shows you the first appearance, the last appearance, and all appearances (as a list):
<lang Mathematica>haystack = {"Zig","Zag","Wally","Ronald","Bush","Zig","Zag","Krusty","Charlie","Bush","Bozo"};
<syntaxhighlight lang="mathematica">haystack = {"Zig","Zag","Wally","Ronald","Bush","Zig","Zag","Krusty","Charlie","Bush","Bozo"};
needle = "Zag";
needle = "Zag";
first = Position[haystack,needle,1][[1,1]]
first = Position[haystack,needle,1][[1,1]]
last = Position[haystack,needle,1][[-1,1]]
last = Position[haystack,needle,1][[-1,1]]
all = Position[haystack,needle,1][[All,1]]</lang>
all = Position[haystack,needle,1][[All,1]]</syntaxhighlight>
gives back:
gives back:
<syntaxhighlight lang="mathematica">2
<lang Mathematica>2
7
7
{2,7}</lang>
{2,7}</syntaxhighlight>


=={{header|MATLAB}}==
=={{header|MATLAB}}==
Collections of strings are stored in cell arrays in MATLAB. The solution bellow will only work for a cell array of this construction:<lang MATLAB>stringCollection = {'string1','string2',...,'stringN'}</lang> It will not work for any other construction, for example:<lang MATLAB>stringCollection = {{'string1'},{'string2'},{...},{'stringN'}}</lang>
Collections of strings are stored in cell arrays in MATLAB. The solution bellow will only work for a cell array of this construction:<syntaxhighlight lang="matlab">stringCollection = {'string1','string2',...,'stringN'}</syntaxhighlight> It will not work for any other construction, for example:<syntaxhighlight lang="matlab">stringCollection = {{'string1'},{'string2'},{...},{'stringN'}}</syntaxhighlight>


searchCollection.m:
searchCollection.m:
<lang MATLAB>function index = searchCollection(list,searchItem,firstLast)
<syntaxhighlight lang="matlab">function index = searchCollection(list,searchItem,firstLast)
%firstLast is a string containing either 'first' or 'last'. The 'first'
%firstLast is a string containing either 'first' or 'last'. The 'first'
Line 2,347: Line 2,347:
assert(~isempty(index),['The string ''' searchItem ''' does not exist in this collection of strings.']);
assert(~isempty(index),['The string ''' searchItem ''' does not exist in this collection of strings.']);


end</lang>
end</syntaxhighlight>


{{out}}
{{out}}
<lang MATLAB>>> list = {'a','b','c','d','e','c','f','c'};
<syntaxhighlight lang="matlab">>> list = {'a','b','c','d','e','c','f','c'};
>> searchCollection(list,'c','first')
>> searchCollection(list,'c','first')


Line 2,365: Line 2,365:
>> searchCollection(list,'g','last')
>> searchCollection(list,'g','last')
??? Error using ==> searchCollection at 11
??? Error using ==> searchCollection at 11
The string 'g' does not exist in this collection of strings.</lang>
The string 'g' does not exist in this collection of strings.</syntaxhighlight>


=={{header|Maxima}}==
=={{header|Maxima}}==
<lang maxima>haystack: ["Zig","Zag","Wally","Ronald","Bush","Zig","Zag","Krusty","Charlie","Bush","Bozo"];
<syntaxhighlight lang="maxima">haystack: ["Zig","Zag","Wally","Ronald","Bush","Zig","Zag","Krusty","Charlie","Bush","Bozo"];
needle: "Zag";
needle: "Zag";


Line 2,376: Line 2,376:
if emptyp(opt) then return(idx),
if emptyp(opt) then return(idx),
opt: first(opt),
opt: first(opt),
if opt='f then first(idx) else if opt='l then last(idx) else throw('unknownmode));</lang>
if opt='f then first(idx) else if opt='l then last(idx) else throw('unknownmode));</syntaxhighlight>


{{out|Usage}}
{{out|Usage}}
Line 2,393: Line 2,393:


=={{header|MAXScript}}==
=={{header|MAXScript}}==
<lang maxscript>haystack=#("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo")
<syntaxhighlight lang="maxscript">haystack=#("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo")


for needle in #("Washington","Bush") do
for needle in #("Washington","Bush") do
Line 2,407: Line 2,407:
format "% %\n" index needle
format "% %\n" index needle
)
)
)</lang>
)</syntaxhighlight>


{{out}}
{{out}}
<lang maxscript>Washington is not in haystack
<syntaxhighlight lang="maxscript">Washington is not in haystack
5 Bush</lang>
5 Bush</syntaxhighlight>


=={{header|Nanoquery}}==
=={{header|Nanoquery}}==
{{trans|Python}}
{{trans|Python}}
<lang Nanoquery>$haystack = list()
<syntaxhighlight lang="nanoquery">$haystack = list()
append $haystack "Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie"
append $haystack "Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie"
append $haystack "Bush" "Bozo"
append $haystack "Bush" "Bozo"
Line 2,431: Line 2,431:
println $needle + " is not in haystack"
println $needle + " is not in haystack"
end
end
end for</lang>
end for</syntaxhighlight>
{{out}}
{{out}}
<pre>Washington is not in haystack
<pre>Washington is not in haystack
Line 2,437: Line 2,437:


=={{header|NetRexx}}==
=={{header|NetRexx}}==
<lang NetRexx>/* NetRexx */
<syntaxhighlight lang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
options replace format comments java crossref symbols nobinary


Line 2,542: Line 2,542:
end needle
end needle
return</lang>
return</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 2,565: Line 2,565:


=={{header|Nim}}==
=={{header|Nim}}==
<lang nim>let haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
<syntaxhighlight lang="nim">let haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]


for needle in ["Bush", "Washington"]:
for needle in ["Bush", "Washington"]:
Line 2,572: Line 2,572:
echo f, " ", needle
echo f, " ", needle
else:
else:
raise newException(ValueError, needle & " not in haystack")</lang>
raise newException(ValueError, needle & " not in haystack")</syntaxhighlight>


{{out}}
{{out}}
Line 2,580: Line 2,580:


=={{header|Objeck}}==
=={{header|Objeck}}==
<lang objeck>use Collection;
<syntaxhighlight lang="objeck">use Collection;


class Test {
class Test {
Line 2,595: Line 2,595:
};
};
}
}
}</lang>
}</syntaxhighlight>


=={{header|Objective-C}}==
=={{header|Objective-C}}==
{{works with|Objective-C|2.0+}}
{{works with|Objective-C|2.0+}}
<lang objc>NSArray *haystack = @[@"Zig",@"Zag",@"Wally",@"Ronald",@"Bush",@"Krusty",@"Charlie",@"Bush",@"Bozo"];
<syntaxhighlight lang="objc">NSArray *haystack = @[@"Zig",@"Zag",@"Wally",@"Ronald",@"Bush",@"Krusty",@"Charlie",@"Bush",@"Bozo"];
for (id needle in @[@"Washington",@"Bush"]) {
for (id needle in @[@"Washington",@"Bush"]) {
int index = [haystack indexOfObject:needle];
int index = [haystack indexOfObject:needle];
Line 2,606: Line 2,606:
else
else
NSLog(@"%i %@", index, needle);
NSLog(@"%i %@", index, needle);
}</lang>
}</syntaxhighlight>


=={{header|OCaml}}==
=={{header|OCaml}}==
<lang ocaml># let find_index pred lst =
<syntaxhighlight lang="ocaml"># let find_index pred lst =
let rec loop n = function
let rec loop n = function
[] -> raise Not_found
[] -> raise Not_found
Line 2,631: Line 2,631:
Washington is not in haystack
Washington is not in haystack
4 Bush
4 Bush
- : unit = ()</lang>
- : unit = ()</syntaxhighlight>


=={{header|Oforth}}==
=={{header|Oforth}}==
Line 2,637: Line 2,637:
indexOf returns null if an object is not into a collection, not an exception.
indexOf returns null if an object is not into a collection, not an exception.


<lang Oforth>: needleIndex(needle, haystack)
<syntaxhighlight lang="oforth">: needleIndex(needle, haystack)
haystack indexOf(needle) dup ifNull: [ drop ExRuntime throw("Not found", needle) ] ;
haystack indexOf(needle) dup ifNull: [ drop ExRuntime throw("Not found", needle) ] ;


Line 2,644: Line 2,644:
needleIndex("Bush", Haystack) println
needleIndex("Bush", Haystack) println
Haystack lastIndexOf("Bush") println
Haystack lastIndexOf("Bush") println
needleIndex("Washington", Haystack) println</lang>
needleIndex("Washington", Haystack) println</syntaxhighlight>


{{out}}
{{out}}
Line 2,657: Line 2,657:
For ordered collections, this will always be the first item.
For ordered collections, this will always be the first item.
For unordered collections, the index returned is undetermined.
For unordered collections, the index returned is undetermined.
<lang ooRexx>-- ordered collections always return the first hit
<syntaxhighlight lang="oorexx">-- ordered collections always return the first hit
a = .array~of(1,2,3,4,4,5)
a = .array~of(1,2,3,4,4,5)
say a~index(4)
say a~index(4)
Line 2,675: Line 2,675:
d["foo"] = 4
d["foo"] = 4
d["bar"] = 4
d["bar"] = 4
say d~index(4)</lang>
say d~index(4)</syntaxhighlight>


=={{header|Oz}}==
=={{header|Oz}}==
Line 2,681: Line 2,681:
(the operation is quite inefficient, after all).
(the operation is quite inefficient, after all).
A possible implementation:
A possible implementation:
<lang oz>declare
<syntaxhighlight lang="oz">declare
%% Lazy list of indices of Y in Xs.
%% Lazy list of indices of Y in Xs.
fun {Indices Y Xs}
fun {Indices Y Xs}
Line 2,704: Line 2,704:
{Show {List.last {Indices "Bush" Haystack}}}
{Show {List.last {Indices "Bush" Haystack}}}


{Show {Index "Washington" Haystack}} %% throws</lang>
{Show {Index "Washington" Haystack}} %% throws</syntaxhighlight>


=={{header|PARI/GP}}==
=={{header|PARI/GP}}==
{{works with|PARI/GP|2.4.3 and above}}
{{works with|PARI/GP|2.4.3 and above}}
<lang parigp>find(v,n)={
<syntaxhighlight lang="parigp">find(v,n)={
my(i=setsearch(v,n));
my(i=setsearch(v,n));
if(i,
if(i,
Line 2,716: Line 2,716:
);
);
i
i
};</lang>
};</syntaxhighlight>


=={{header|Pascal}}==
=={{header|Pascal}}==
Line 2,722: Line 2,722:


=={{header|Perl}}==
=={{header|Perl}}==
<lang perl>use List::Util qw(first);
<syntaxhighlight lang="perl">use List::Util qw(first);


my @haystack = qw(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);
my @haystack = qw(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);
Line 2,734: Line 2,734:
print "$needle is not in haystack\n";
print "$needle is not in haystack\n";
}
}
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 2,742: Line 2,742:


You could install a non-standard module List::MoreUtils:
You could install a non-standard module List::MoreUtils:
<lang perl>use List::MoreUtils qw(first_index);
<syntaxhighlight lang="perl">use List::MoreUtils qw(first_index);


my @haystack = qw(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);
my @haystack = qw(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);
Line 2,754: Line 2,754:
print "$needle is not in haystack\n";
print "$needle is not in haystack\n";
}
}
}</lang>
}</syntaxhighlight>


Alternatively, if you need to do this a lot, you could create a hash table mapping values to indices in the haystack:
Alternatively, if you need to do this a lot, you could create a hash table mapping values to indices in the haystack:
<lang perl>my @haystack = qw(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);
<syntaxhighlight lang="perl">my @haystack = qw(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);


my %haystack_indices;
my %haystack_indices;
Line 2,769: Line 2,769:
print "$needle is not in haystack\n";
print "$needle is not in haystack\n";
}
}
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 2,778: Line 2,778:
=={{header|Phix}}==
=={{header|Phix}}==
{{libheader|Phix/basics}}
{{libheader|Phix/basics}}
<!--<lang Phix>-->
<!--<syntaxhighlight lang="phix">-->
<span style="color: #008080;">constant</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Zig"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Zag"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Wally"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Ronald"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Bush"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Krusty"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Charlie"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Bush"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Boz"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Zag"</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"Zig"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Zag"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Wally"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Ronald"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Bush"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Krusty"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Charlie"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Bush"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Boz"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Zag"</span><span style="color: #0000FF;">}</span>
Line 2,786: Line 2,786:
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">rfind</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Zag"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">r</span> <span style="color: #000080;font-style:italic;">-- 10 (last)</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">rfind</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Zag"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">r</span> <span style="color: #000080;font-style:italic;">-- 10 (last)</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Zog"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">r</span> <span style="color: #000080;font-style:italic;">-- 0 (none)</span>
<span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Zog"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">r</span> <span style="color: #000080;font-style:italic;">-- 0 (none)</span>
<!--</lang>-->
<!--</syntaxhighlight>-->


=={{header|Phixmonti}}==
=={{header|Phixmonti}}==
<lang Phixmonti>"mouse" "hat" "cup" "deodorant" "television"
<syntaxhighlight lang="phixmonti">"mouse" "hat" "cup" "deodorant" "television"
"soap" "methamphetamine" "severed cat heads" "cup"
"soap" "methamphetamine" "severed cat heads" "cup"
pstack
pstack
Line 2,814: Line 2,814:
endif
endif
endif
endif
drop</lang>
drop</syntaxhighlight>


Other solution with syntactic sugar for list construction.
Other solution with syntactic sugar for list construction.


<lang Phixmonti>include Utilitys.pmt
<syntaxhighlight lang="phixmonti">include Utilitys.pmt


0 var acum
0 var acum
Line 2,839: Line 2,839:
search
search
endwhile
endwhile
</syntaxhighlight>
</lang>


=={{header|PHP}}==
=={{header|PHP}}==
<lang php>$haystack = array("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo");
<syntaxhighlight lang="php">$haystack = array("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo");


foreach (array("Washington","Bush") as $needle) {
foreach (array("Washington","Bush") as $needle) {
Line 2,850: Line 2,850:
else
else
echo "$i $needle\n";
echo "$i $needle\n";
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 2,861: Line 2,861:


And Picat is 1-based.
And Picat is 1-based.
<lang Picat>import util.
<syntaxhighlight lang="picat">import util.


go =>
go =>
Line 2,894: Line 2,894:
if Ixs == [] then
if Ixs == [] then
throw $error(search_list_all(Needle),not_found)
throw $error(search_list_all(Needle),not_found)
end.</lang>
end.</syntaxhighlight>


{{out}}
{{out}}
Line 2,907: Line 2,907:
Note that in PicoLisp all indexes are one-based
Note that in PicoLisp all indexes are one-based
(the first element has the position '1')
(the first element has the position '1')
<lang PicoLisp>(de lastIndex (Item Lst)
<syntaxhighlight lang="picolisp">(de lastIndex (Item Lst)
(- (length Lst) (index Item (reverse Lst)) -1) )
(- (length Lst) (index Item (reverse Lst)) -1) )


Line 2,916: Line 2,916:
(findNeedle index 'Washington Lst)
(findNeedle index 'Washington Lst)
(findNeedle index 'Bush Lst)
(findNeedle index 'Bush Lst)
(findNeedle lastIndex 'Bush Lst) )</lang>
(findNeedle lastIndex 'Bush Lst) )</syntaxhighlight>
{{out}}
{{out}}
<pre>Washington not found
<pre>Washington not found
Line 2,923: Line 2,923:


=={{header|PL/I}}==
=={{header|PL/I}}==
<lang pli>search: procedure () returns (fixed binary);
<syntaxhighlight lang="pli">search: procedure () returns (fixed binary);
declare haystack (0:9) character (200) varying static initial
declare haystack (0:9) character (200) varying static initial
('apple', 'banana', 'celery', 'dumpling', 'egg', 'flour',
('apple', 'banana', 'celery', 'dumpling', 'egg', 'flour',
Line 2,943: Line 2,943:
signal condition(missing_needle);
signal condition(missing_needle);
return (lbound(haystack,1)-1);
return (lbound(haystack,1)-1);
end search;</lang>
end search;</syntaxhighlight>


=={{header|Plain English}}==
=={{header|Plain English}}==
<lang plainenglish>To run:
<syntaxhighlight lang="plainenglish">To run:
Start up.
Start up.
Make an example haystack.
Make an example haystack.
Line 2,983: Line 2,983:
Put the bale's next into the bale.
Put the bale's next into the bale.
Bump the count.
Bump the count.
Repeat.</lang>
Repeat.</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 2,992: Line 2,992:
{{works with|PowerBASIC for Windows}}
{{works with|PowerBASIC for Windows}}


<lang powerbasic>FUNCTION PBMAIN () AS LONG
<syntaxhighlight lang="powerbasic">FUNCTION PBMAIN () AS LONG
DIM haystack(54) AS STRING
DIM haystack(54) AS STRING
ARRAY ASSIGN haystack() = "foo", "bar", "baz", "quux", "quuux", "quuuux", _
ARRAY ASSIGN haystack() = "foo", "bar", "baz", "quux", "quuux", "quuuux", _
Line 3,031: Line 3,031:
END IF
END IF
LOOP
LOOP
END FUNCTION</lang>
END FUNCTION</syntaxhighlight>


=={{header|PowerShell}}==
=={{header|PowerShell}}==
{{works with|PowerShell|4.0}}
{{works with|PowerShell|4.0}}
<syntaxhighlight lang="powershell">
<lang PowerShell>
function index($haystack,$needle) {
function index($haystack,$needle) {
$index = $haystack.IndexOf($needle)
$index = $haystack.IndexOf($needle)
Line 3,048: Line 3,048:
index $haystack "house"
index $haystack "house"
index $haystack "paragraph"
index $haystack "paragraph"
</syntaxhighlight>
</lang>
<b>Output:</b>
<b>Output:</b>
<pre>
<pre>
Line 3,057: Line 3,057:
===PowerShell Extra credit===
===PowerShell Extra credit===
The -Verbose switch is available to any advanced function.
The -Verbose switch is available to any advanced function.
<syntaxhighlight lang="powershell">
<lang PowerShell>
function Find-Needle
function Find-Needle
{
{
Line 3,115: Line 3,115:


$haystack = @("word", "phrase", "preface", "title", "house", "line", "chapter", "page", "book", "house")
$haystack = @("word", "phrase", "preface", "title", "house", "line", "chapter", "page", "book", "house")
</syntaxhighlight>
</lang>
<syntaxhighlight lang="powershell">
<lang PowerShell>
Find-Needle "house" $haystack
Find-Needle "house" $haystack
</syntaxhighlight>
</lang>
{{Out}}
{{Out}}
<pre>
<pre>
4
4
</pre>
</pre>
<syntaxhighlight lang="powershell">
<lang PowerShell>
Find-Needle "house" $haystack -Verbose
Find-Needle "house" $haystack -Verbose
</syntaxhighlight>
</lang>
{{Out}}
{{Out}}
<pre>
<pre>
Line 3,131: Line 3,131:
4
4
</pre>
</pre>
<syntaxhighlight lang="powershell">
<lang PowerShell>
Find-Needle "house" $haystack -LastIndex -Verbose
Find-Needle "house" $haystack -LastIndex -Verbose
</syntaxhighlight>
</lang>
{{Out}}
{{Out}}
<pre>
<pre>
Line 3,139: Line 3,139:
9
9
</pre>
</pre>
<syntaxhighlight lang="powershell">
<lang PowerShell>
Find-Needle "title" $haystack -LastIndex -Verbose
Find-Needle "title" $haystack -LastIndex -Verbose
</syntaxhighlight>
</lang>
{{Out}}
{{Out}}
<pre>
<pre>
Line 3,147: Line 3,147:
3
3
</pre>
</pre>
<syntaxhighlight lang="powershell">
<lang PowerShell>
Find-Needle "something" $haystack -Verbose
Find-Needle "something" $haystack -Verbose
</syntaxhighlight>
</lang>
{{Out}}
{{Out}}
<pre>
<pre>
Line 3,158: Line 3,158:
=={{header|Prolog}}==
=={{header|Prolog}}==
Works with SWI-Prolog
Works with SWI-Prolog
<lang Prolog>search_a_list(N1, N2) :-
<syntaxhighlight lang="prolog">search_a_list(N1, N2) :-
L = ["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"],
L = ["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"],


Line 3,181: Line 3,181:
my_write(Name) :-
my_write(Name) :-
writef(' %s', [Name]).
writef(' %s', [Name]).
</syntaxhighlight>
</lang>


{{out}}
{{out}}
Line 3,194: Line 3,194:


=={{header|PureBasic}}==
=={{header|PureBasic}}==
<lang PureBasic>If OpenConsole() ; Open a simple console to interact with user
<syntaxhighlight lang="purebasic">If OpenConsole() ; Open a simple console to interact with user
NewList Straws.s()
NewList Straws.s()
Define Straw$, target$="TBA"
Define Straw$, target$="TBA"
Line 3,229: Line 3,229:
haystack:
haystack:
Data.s "Zig","Zag","Zig","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo",""
Data.s "Zig","Zag","Zig","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo",""
EndDataSection</lang>
EndDataSection</syntaxhighlight>


=={{header|Python}}==
=={{header|Python}}==
<lang python>haystack=["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
<syntaxhighlight lang="python">haystack=["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]


for needle in ("Washington","Bush"):
for needle in ("Washington","Bush"):
Line 3,238: Line 3,238:
print haystack.index(needle), needle
print haystack.index(needle), needle
except ValueError, value_error:
except ValueError, value_error:
print needle,"is not in haystack"</lang>
print needle,"is not in haystack"</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 3,248: Line 3,248:
The following shows the default information given
The following shows the default information given
when the exception is not captured in the program:
when the exception is not captured in the program:
<lang python>>>> haystack=["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
<syntaxhighlight lang="python">>>> haystack=["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
>>> haystack.index('Bush')
>>> haystack.index('Bush')
4
4
Line 3,256: Line 3,256:
haystack.index('Washington')
haystack.index('Washington')
ValueError: list.index(x): x not in list
ValueError: list.index(x): x not in list
>>></lang>
>>></syntaxhighlight>


There is no built-in method for returning the highest index of a repeated string in a Python list, tuple or array, (although strings have [http://docs.python.org/library/stdtypes.html?highlight=rindex#str.rindex rindex]).
There is no built-in method for returning the highest index of a repeated string in a Python list, tuple or array, (although strings have [http://docs.python.org/library/stdtypes.html?highlight=rindex#str.rindex rindex]).
Instead we need to look for the index in the reversed list and adjust the result.
Instead we need to look for the index in the reversed list and adjust the result.
<lang python>>>> def hi_index(needle, haystack):
<syntaxhighlight lang="python">>>> def hi_index(needle, haystack):
return len(haystack)-1 - haystack[::-1].index(needle)
return len(haystack)-1 - haystack[::-1].index(needle)


Line 3,271: Line 3,271:
assert hi == haystack.index(n), "index == hi_index if needle occurs only once"
assert hi == haystack.index(n), "index == hi_index if needle occurs only once"


>>></lang>
>>></syntaxhighlight>


=={{header|R}}==
=={{header|R}}==
<lang R>find.needle <- function(haystack, needle="needle", return.last.index.too=FALSE)
<syntaxhighlight lang="r">find.needle <- function(haystack, needle="needle", return.last.index.too=FALSE)
{
{
indices <- which(haystack %in% needle)
indices <- which(haystack %in% needle)
if(length(indices)==0) stop("no needles in the haystack")
if(length(indices)==0) stop("no needles in the haystack")
if(return.last.index.too) range(indices) else min(indices)
if(return.last.index.too) range(indices) else min(indices)
}</lang>
}</syntaxhighlight>
Example usage:
Example usage:
<lang R>haystack1 <- c("where", "is", "the", "needle", "I", "wonder")
<syntaxhighlight lang="r">haystack1 <- c("where", "is", "the", "needle", "I", "wonder")
haystack2 <- c("no", "sewing", "equipment", "in", "here")
haystack2 <- c("no", "sewing", "equipment", "in", "here")
haystack3 <- c("oodles", "of", "needles", "needles", "needles", "in", "here")
haystack3 <- c("oodles", "of", "needles", "needles", "needles", "in", "here")
Line 3,288: Line 3,288:
find.needle(haystack2) # error
find.needle(haystack2) # error
find.needle(haystack3) # 3
find.needle(haystack3) # 3
find.needle(haystack3, needle="needles", ret=TRUE) # 3 5</lang>
find.needle(haystack3, needle="needles", ret=TRUE) # 3 5</syntaxhighlight>


=={{header|Racket}}==
=={{header|Racket}}==
The function index returns the index of the the element x in the sequence xs.
The function index returns the index of the the element x in the sequence xs.
If the element is not found, then #f is returned.
If the element is not found, then #f is returned.
<lang racket>(define (index xs y)
<syntaxhighlight lang="racket">(define (index xs y)
(for/first ([(x i) (in-indexed xs)]
(for/first ([(x i) (in-indexed xs)]
#:when (equal? x y))
#:when (equal? x y))
i))</lang>
i))</syntaxhighlight>


If the last index of an element is needed, for/last is used:
If the last index of an element is needed, for/last is used:
<lang racket>(define (index-last xs y)
<syntaxhighlight lang="racket">(define (index-last xs y)
(for/last ([(x i) (in-indexed xs)]
(for/last ([(x i) (in-indexed xs)]
#:when (equal? x y))
#:when (equal? x y))
i))</lang>
i))</syntaxhighlight>


Both index and index-last can handle any sequence such as lists, vectors, sets etc.
Both index and index-last can handle any sequence such as lists, vectors, sets etc.
Let us test with a linked list:
Let us test with a linked list:
<lang racket>(define haystack '("Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Bozo"))
<syntaxhighlight lang="racket">(define haystack '("Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Bozo"))


(for/list ([needle '("Bender" "Bush")])
(for/list ([needle '("Bender" "Bush")])
Line 3,312: Line 3,312:


(for/list ([needle '("Bender" "Bush")])
(for/list ([needle '("Bender" "Bush")])
(index-last haystack needle))</lang>
(index-last haystack needle))</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 3,323: Line 3,323:


{{works with|Rakudo Star|2016.07}}
{{works with|Rakudo Star|2016.07}}
<lang perl6>my @haystack = <Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo>;
<syntaxhighlight lang="raku" line>my @haystack = <Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo>;
for <Washington Bush> -> $needle {
for <Washington Bush> -> $needle {
say "$needle -- { @haystack.first($needle, :k) // 'not in haystack' }";
say "$needle -- { @haystack.first($needle, :k) // 'not in haystack' }";
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 3,338: Line 3,338:
Or, including the "extra credit" task:
Or, including the "extra credit" task:
{{works with|Rakudo Star|2016.07}}
{{works with|Rakudo Star|2016.07}}
<lang perl6>my Str @haystack = <Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo>;
<syntaxhighlight lang="raku" line>my Str @haystack = <Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo>;


for <Washingston Bush> -> $needle {
for <Washingston Bush> -> $needle {
Line 3,350: Line 3,350:
say "$needle -- not in haystack";
say "$needle -- not in haystack";
}
}
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 3,364: Line 3,364:
<br>
<br>
If you plan to do many searches on the same large list, you might want to build a search hash first for efficient look-up:
If you plan to do many searches on the same large list, you might want to build a search hash first for efficient look-up:
<lang perl6>my @haystack = <Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo>;
<syntaxhighlight lang="raku" line>my @haystack = <Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo>;


my %index;
my %index;
Line 3,371: Line 3,371:
for <Washington Bush> -> $needle {
for <Washington Bush> -> $needle {
say "$needle -- { %index{$needle} // 'not in haystack' }";
say "$needle -- { %index{$needle} // 'not in haystack' }";
}</lang>
}</syntaxhighlight>


=={{header|REBOL}}==
=={{header|REBOL}}==
<lang REBOL>REBOL [
<syntaxhighlight lang="rebol">REBOL [
Title: "List Indexing"
Title: "List Indexing"
URL: http://rosettacode.org/wiki/Index_in_a_list
URL: http://rosettacode.org/wiki/Index_in_a_list
Line 3,411: Line 3,411:
reform [needle "=>" locate/largest haystack needle]
reform [needle "=>" locate/largest haystack needle]
]
]
]</lang>
]</syntaxhighlight>


{{out}}
{{out}}
Line 3,430: Line 3,430:
<br><br>The haystack items may have any character, including blanks.
<br><br>The haystack items may have any character, including blanks.
<br>A ''null'' value isn't allowed in this method of representing values.
<br>A ''null'' value isn't allowed in this method of representing values.
<lang rexx>/*REXX program searches a collection of strings (an array of periodic table elements).*/
<syntaxhighlight lang="rexx">/*REXX program searches a collection of strings (an array of periodic table elements).*/
hay.= /*initialize the haystack collection. */
hay.= /*initialize the haystack collection. */
hay.1 = 'sodium'
hay.1 = 'sodium'
Line 3,458: Line 3,458:
if found then return j /*return the haystack index number. */
if found then return j /*return the haystack index number. */
else say needle "wasn't found in the haystack!"
else say needle "wasn't found in the haystack!"
return 0 /*indicates the needle wasn't found. */</lang>
return 0 /*indicates the needle wasn't found. */</syntaxhighlight>


===version 2===
===version 2===
Line 3,466: Line 3,466:
this counter may be any sufficiently high number.
this counter may be any sufficiently high number.
<br><br>The array may be out of order (but not recommended!).
<br><br>The array may be out of order (but not recommended!).
<lang rexx>/*REXX program searches a collection of strings (an array of periodic table elements).*/
<syntaxhighlight lang="rexx">/*REXX program searches a collection of strings (an array of periodic table elements).*/
hay.0 = 1000 /*safely indicate highest item number. */
hay.0 = 1000 /*safely indicate highest item number. */
hay.200 = 'Binilnilium'
hay.200 = 'Binilnilium'
Line 3,499: Line 3,499:
if found then return j /*return the haystack index number. */
if found then return j /*return the haystack index number. */
else say needle "wasn't found in the haystack!"
else say needle "wasn't found in the haystack!"
return 0 /*indicates the needle wasn't found. */</lang>
return 0 /*indicates the needle wasn't found. */</syntaxhighlight>


===version 3===
===version 3===
Line 3,514: Line 3,514:
<br>variable names. Therefore, there shouldn't be any REXX variable names (in this
<br>variable names. Therefore, there shouldn't be any REXX variable names (in this
<br>program) that have a leading underscore &nbsp; ('''_''').
<br>program) that have a leading underscore &nbsp; ('''_''').
<lang rexx>/*REXX program searches a collection of strings (an array of periodic table elements).*/
<syntaxhighlight lang="rexx">/*REXX program searches a collection of strings (an array of periodic table elements).*/
hay.=0 /*initialize the haystack collection. */
hay.=0 /*initialize the haystack collection. */
hay._sodium = 1
hay._sodium = 1
Line 3,542: Line 3,542:
if found then return j /*return the haystack index number. */
if found then return j /*return the haystack index number. */
else say needle "wasn't found in the haystack!"
else say needle "wasn't found in the haystack!"
return 0 /*indicates the needle wasn't found. */</lang>
return 0 /*indicates the needle wasn't found. */</syntaxhighlight>


===version 4===
===version 4===
This method uses a simple string (so haystack items can't have embedded blanks or tabs in them).
This method uses a simple string (so haystack items can't have embedded blanks or tabs in them).
<br>Code was added to uppercase both the &nbsp; '''haystack''' &nbsp; and the &nbsp; '''needle''' &nbsp; to make the search &nbsp; ''case insensitive''.
<br>Code was added to uppercase both the &nbsp; '''haystack''' &nbsp; and the &nbsp; '''needle''' &nbsp; to make the search &nbsp; ''case insensitive''.
<lang rexx>/*REXX program searches a collection of strings (an array of periodic table elements).*/
<syntaxhighlight lang="rexx">/*REXX program searches a collection of strings (an array of periodic table elements).*/
/*───────────────names of the first 200 elements of the periodic table.─────────────*/
/*───────────────names of the first 200 elements of the periodic table.─────────────*/
_= 'hydrogen helium lithium beryllium boron carbon nitrogen oxygen fluorine neon sodium'
_= 'hydrogen helium lithium beryllium boron carbon nitrogen oxygen fluorine neon sodium'
Line 3,583: Line 3,583:
else say needle "wasn't found in the haystack!"
else say needle "wasn't found in the haystack!"
return 0 /*indicates the needle wasn't found. */
return 0 /*indicates the needle wasn't found. */
/*stick a fork in it, we're all done. */</lang>
/*stick a fork in it, we're all done. */</syntaxhighlight>


=={{header|Ring}}==
=={{header|Ring}}==
<lang ring>
<syntaxhighlight lang="ring">
haystack = ["alpha","bravo","charlie","delta","echo","foxtrot","golf",
haystack = ["alpha","bravo","charlie","delta","echo","foxtrot","golf",
"hotel","india","juliet","kilo","lima","mike","needle",
"hotel","india","juliet","kilo","lima","mike","needle",
Line 3,605: Line 3,605:
if !=index see " last found at index " + last + nl
if !=index see " last found at index " + last + nl
else see "not found" + nl ok
else see "not found" + nl ok
</syntaxhighlight>
</lang>
Output:
Output:
<pre>
<pre>
Line 3,613: Line 3,613:


=={{header|Ruby}}==
=={{header|Ruby}}==
<lang ruby>haystack = %w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo)
<syntaxhighlight lang="ruby">haystack = %w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo)


%w(Bush Washington).each do |needle|
%w(Bush Washington).each do |needle|
Line 3,621: Line 3,621:
raise "#{needle} is not in haystack\n"
raise "#{needle} is not in haystack\n"
end
end
end</lang>
end</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 3,631: Line 3,631:


'''Extra credit'''
'''Extra credit'''
<lang ruby>haystack.each do |item|
<syntaxhighlight lang="ruby">haystack.each do |item|
last = haystack.rindex(item)
last = haystack.rindex(item)
if last > haystack.index(item)
if last > haystack.index(item)
Line 3,638: Line 3,638:
end
end
end
end
#=> Bush last appears at index 7</lang>
#=> Bush last appears at index 7</syntaxhighlight>
or
or
<lang ruby>multi_item = haystack.each_index.group_by{|idx| haystack[idx]}.select{|key, val| val.length > 1}
<syntaxhighlight lang="ruby">multi_item = haystack.each_index.group_by{|idx| haystack[idx]}.select{|key, val| val.length > 1}
# multi_item is => {"Bush"=>[4, 7]}
# multi_item is => {"Bush"=>[4, 7]}
multi_item.each do |key, val|
multi_item.each do |key, val|
puts "#{key} appears at index #{val}"
puts "#{key} appears at index #{val}"
end
end
#=> Bush appears at index [4, 7]</lang>
#=> Bush appears at index [4, 7]</syntaxhighlight>


=={{header|Run BASIC}}==
=={{header|Run BASIC}}==
<lang runbasic>haystack$ = ("Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo Bush ")
<syntaxhighlight lang="runbasic">haystack$ = ("Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo Bush ")
needle$ = "Zag Wally Bush Chicken"
needle$ = "Zag Wally Bush Chicken"


Line 3,668: Line 3,668:
print thisNeedle$;" is not in the list"
print thisNeedle$;" is not in the list"
end if
end if
wend</lang>
wend</syntaxhighlight>
{{out}}
{{out}}
<pre>Zag located at:5
<pre>Zag located at:5
Line 3,679: Line 3,679:
Rust encourages to encode possible errors in function's return type. For example, <code>position</code> returns <code>Option<usize></code>, which can be <code>None</code> or <code>Some(x)</code>.
Rust encourages to encode possible errors in function's return type. For example, <code>position</code> returns <code>Option<usize></code>, which can be <code>None</code> or <code>Some(x)</code>.


<lang rust>fn main() {
<syntaxhighlight lang="rust">fn main() {
let haystack=vec!["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie",
let haystack=vec!["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie",
"Bush", "Boz", "Zag"];
"Bush", "Boz", "Zag"];
Line 3,687: Line 3,687:
println!("First occurence of 'Rob' at {:?}",haystack.iter().position(|s| *s=="Rob"));
println!("First occurence of 'Rob' at {:?}",haystack.iter().position(|s| *s=="Rob"));
}
}
</syntaxhighlight>
</lang>


{{out}}
{{out}}
Line 3,698: Line 3,698:
===Version that panics===
===Version that panics===


<lang rust>fn main() {
<syntaxhighlight lang="rust">fn main() {
let haystack=vec!["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie",
let haystack=vec!["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie",
"Bush", "Boz", "Zag"];
"Bush", "Boz", "Zag"];
Line 3,706: Line 3,706:
println!("First occurence of 'Rob' at {:?}",haystack.iter().position(|s| *s=="Rob").unwrap());
println!("First occurence of 'Rob' at {:?}",haystack.iter().position(|s| *s=="Rob").unwrap());
}
}
</syntaxhighlight>
</lang>


{{out}}
{{out}}
Line 3,717: Line 3,717:


=={{header|S-lang}}==
=={{header|S-lang}}==
<lang S-lang>variable haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo","Ronald"];
<syntaxhighlight lang="s-lang">variable haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo","Ronald"];
define find(needle)
define find(needle)
Line 3,732: Line 3,732:
($1, $2) = find("Ronald"); % returns 3, 9
($1, $2) = find("Ronald"); % returns 3, 9
($1, $2) = find("McDonald"); % throws ApplicationError, labelled "an exception"
($1, $2) = find("McDonald"); % throws ApplicationError, labelled "an exception"
</syntaxhighlight>
</lang>


=={{header|Sather}}==
=={{header|Sather}}==
{{trans|C_sharp}}
{{trans|C_sharp}}


<lang sather>class MAIN is
<syntaxhighlight lang="sather">class MAIN is
main is
main is
haystack :ARRAY{STR} := |"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Bozo"|;
haystack :ARRAY{STR} := |"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Bozo"|;
Line 3,750: Line 3,750:
end;
end;
end;
end;
end;</lang>
end;</syntaxhighlight>


=={{header|Scala}}==
=={{header|Scala}}==
Line 3,762: Line 3,762:
not using those or similar methods might be written like this:
not using those or similar methods might be written like this:


<lang scala>def findNeedles(needle: String, haystack: Seq[String]) = haystack.zipWithIndex.filter(_._1 == needle).map(_._2)
<syntaxhighlight lang="scala">def findNeedles(needle: String, haystack: Seq[String]) = haystack.zipWithIndex.filter(_._1 == needle).map(_._2)
def firstNeedle(needle: String, haystack: Seq[String]) = findNeedles(needle, haystack).head
def firstNeedle(needle: String, haystack: Seq[String]) = findNeedles(needle, haystack).head
def lastNeedle(needle: String, haystack: Seq[String]) = findNeedles(needle, haystack).last</lang>
def lastNeedle(needle: String, haystack: Seq[String]) = findNeedles(needle, haystack).last</syntaxhighlight>


It does raise an exception if there's no needle.
It does raise an exception if there's no needle.


=={{header|Scheme}}==
=={{header|Scheme}}==
<lang scheme>(define haystack
<syntaxhighlight lang="scheme">(define haystack
'("Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Bozo"))
'("Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Bozo"))


Line 3,784: Line 3,784:
(if tail
(if tail
(- (length tail) 1)
(- (length tail) 1)
(throw 'needle-missing)))))</lang>
(throw 'needle-missing)))))</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 3,794: Line 3,794:


=={{header|SenseTalk}}==
=={{header|SenseTalk}}==
<lang sensetalk>
<syntaxhighlight lang="sensetalk">
put ("apple", "banana", "cranberry" ,"durian", "eggplant", "grape", "banana", "appl", "blackberry") into fruitList
put ("apple", "banana", "cranberry" ,"durian", "eggplant", "grape", "banana", "appl", "blackberry") into fruitList


Line 3,812: Line 3,812:
end if
end if
end findInList
end findInList
</syntaxhighlight>
</lang>
Note: Sensetalk indexes from 1
Note: Sensetalk indexes from 1


=={{header|Sidef}}==
=={{header|Sidef}}==
<lang ruby>var haystack = %w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);
<syntaxhighlight lang="ruby">var haystack = %w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);


%w(Bush Washington).each { |needle|
%w(Bush Washington).each { |needle|
Line 3,825: Line 3,825:
die "#{needle} is not in haystack";
die "#{needle} is not in haystack";
}
}
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 3,832: Line 3,832:
</pre>
</pre>
Extra credit:
Extra credit:
<lang ruby>var haystack = %w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);
<syntaxhighlight lang="ruby">var haystack = %w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);
say haystack.last_index{|item| item == "Bush"};</lang>
say haystack.last_index{|item| item == "Bush"};</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 3,840: Line 3,840:


=={{header|Slate}}==
=={{header|Slate}}==
<lang slate>define: #haystack -> ('Zig,Zag,Wally,Ronald,Bush,Krusty,Charlie,Bush,Bozo' splitWith: $,).
<syntaxhighlight lang="slate">define: #haystack -> ('Zig,Zag,Wally,Ronald,Bush,Krusty,Charlie,Bush,Bozo' splitWith: $,).
{'Washington'. 'Bush'} do: [| :needle |
{'Washington'. 'Bush'} do: [| :needle |
(haystack indexOf: needle)
(haystack indexOf: needle)
Line 3,848: Line 3,848:
lastIndex: (haystack lastIndexOf: word).
lastIndex: (haystack lastIndexOf: word).
lastIndex isNotNil /\ (lastIndex > firstIndex) ifTrue:
lastIndex isNotNil /\ (lastIndex > firstIndex) ifTrue:
[inform: 'last occurrence of ' ; word ; ' is at index ' ; lastIndex]]].</lang>
[inform: 'last occurrence of ' ; word ; ' is at index ' ; lastIndex]]].</syntaxhighlight>


=={{header|Smalltalk}}==
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}{{works with|Smalltalk/X}}
{{works with|GNU Smalltalk}}{{works with|Smalltalk/X}}
Notice: Smalltalk indexes start at 1.
Notice: Smalltalk indexes start at 1.
<lang smalltalk>| haystack |
<syntaxhighlight lang="smalltalk">| haystack |
haystack := 'Zig,Zag,Wally,Ronald,Bush,Krusty,Charlie,Bush,Bozo' subStrings: $,.
haystack := 'Zig,Zag,Wally,Ronald,Bush,Krusty,Charlie,Bush,Bozo' subStrings: $,.
{ 'Washington' . 'Bush' } do: [:word |
{ 'Washington' . 'Bush' } do: [:word |
Line 3,867: Line 3,867:
('last occurence of %1 is at index %2' % { word . l }) displayNl ]
('last occurence of %1 is at index %2' % { word . l }) displayNl ]
]
]
].</lang>
].</syntaxhighlight>
the above example did not raise an exception; the following does (a handler has been added to proceed for more search words):
the above example did not raise an exception; the following does (a handler has been added to proceed for more search words):
{{works with|Smalltalk/X}}
{{works with|Smalltalk/X}}
Notice: the code below uses the ST/X embedded-expression-string extension.
Notice: the code below uses the ST/X embedded-expression-string extension.
<lang smalltalk>| haystack |
<syntaxhighlight lang="smalltalk">| haystack |
haystack := 'Zig,Zag,Wally,Ronald,Bush,Krusty,Charlie,Bush,Bozo' subStrings: $,.
haystack := 'Zig,Zag,Wally,Ronald,Bush,Krusty,Charlie,Bush,Bozo' subStrings: $,.
[
[
Line 3,892: Line 3,892:
'but I don''t care and proceed...' printCR.
'but I don''t care and proceed...' printCR.
ex proceed.
ex proceed.
]</lang>
]</syntaxhighlight>
{{out}}
{{out}}
<pre>not found exception raised for: Washington
<pre>not found exception raised for: Washington
Line 3,901: Line 3,901:
=={{header|Standard ML}}==
=={{header|Standard ML}}==


<lang sml>fun find_index (pred, lst) = let
<syntaxhighlight lang="sml">fun find_index (pred, lst) = let
fun loop (n, []) = NONE
fun loop (n, []) = NONE
| loop (n, x::xs) = if pred x then SOME n
| loop (n, x::xs) = if pred x then SOME n
Line 3,915: Line 3,915:
SOME i => print (Int.toString i ^ " " ^ needle ^ "\n")
SOME i => print (Int.toString i ^ " " ^ needle ^ "\n")
| NONE => print (needle ^ " is not in haystack\n"))
| NONE => print (needle ^ " is not in haystack\n"))
["Washington", "Bush"];</lang>
["Washington", "Bush"];</syntaxhighlight>


=={{header|Swift}}==
=={{header|Swift}}==
{{works with|Swift|2.x+}}
{{works with|Swift|2.x+}}
<lang swift>let haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
<syntaxhighlight lang="swift">let haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
for needle in ["Washington","Bush"] {
for needle in ["Washington","Bush"] {
if let index = haystack.indexOf(needle) {
if let index = haystack.indexOf(needle) {
Line 3,926: Line 3,926:
print("\(needle) is not in haystack")
print("\(needle) is not in haystack")
}
}
}</lang>
}</syntaxhighlight>
{{works with|Swift|1.x}}
{{works with|Swift|1.x}}
<lang swift>let haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
<syntaxhighlight lang="swift">let haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
for needle in ["Washington","Bush"] {
for needle in ["Washington","Bush"] {
if let index = find(haystack, needle) {
if let index = find(haystack, needle) {
Line 3,935: Line 3,935:
println("\(needle) is not in haystack")
println("\(needle) is not in haystack")
}
}
}</lang>
}</syntaxhighlight>


The second task:
The second task:
{{works with|Swift|2.x+}}
{{works with|Swift|2.x+}}


<lang swift>
<syntaxhighlight lang="swift">
// the second part can be done several ways, but extending any Array of Comparable objects is the most generic approach
// the second part can be done several ways, but extending any Array of Comparable objects is the most generic approach
extension Array where Element : Comparable {
extension Array where Element : Comparable {
Line 3,963: Line 3,963:




</syntaxhighlight>
</lang>


=={{header|Tcl}}==
=={{header|Tcl}}==
<lang tcl>set haystack {Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo}
<syntaxhighlight lang="tcl">set haystack {Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo}
foreach needle {Bush Washington} {
foreach needle {Bush Washington} {
if {[set idx [lsearch -exact $haystack $needle]] == -1} {
if {[set idx [lsearch -exact $haystack $needle]] == -1} {
Line 3,973: Line 3,973:
puts "$needle appears at index $idx in the haystack"
puts "$needle appears at index $idx in the haystack"
}
}
}</lang>
}</syntaxhighlight>
'''Extra credit:'''
'''Extra credit:'''
<lang tcl>set haystack {Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo}
<syntaxhighlight lang="tcl">set haystack {Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo}
foreach needle {Bush Washington} {
foreach needle {Bush Washington} {
set indices [lsearch -all -exact $haystack $needle]
set indices [lsearch -all -exact $haystack $needle]
Line 3,983: Line 3,983:
puts "$needle appears first at index [lindex $indices 0] and last at [lindex $indices end]"
puts "$needle appears first at index [lindex $indices 0] and last at [lindex $indices end]"
}
}
}</lang>
}</syntaxhighlight>


=={{header|TorqueScript}}==
=={{header|TorqueScript}}==
Line 3,991: Line 3,991:
Find multiple needles in a haystack:
Find multiple needles in a haystack:


<lang TorqueScript>function findIn(%haystack,%needles)
<syntaxhighlight lang="torquescript">function findIn(%haystack,%needles)
{
{
%hc = getWordCount(%haystack);
%hc = getWordCount(%haystack);
Line 4,025: Line 4,025:
return %string;
return %string;
}</lang>
}</syntaxhighlight>


How to use it:
How to use it:


<lang TorqueScript>echo(findIn("Hello world, you are quite sunny today.","quite hello somethingelse"));</lang>
<syntaxhighlight lang="torquescript">echo(findIn("Hello world, you are quite sunny today.","quite hello somethingelse"));</syntaxhighlight>


returns:
returns:


<lang TorqueScript>=> "quite_4 hello_0 somethingelse_-1"</lang>
<syntaxhighlight lang="torquescript">=> "quite_4 hello_0 somethingelse_-1"</syntaxhighlight>


=={{header|TUSCRIPT}}==
=={{header|TUSCRIPT}}==
<lang tuscript>$$ MODE TUSCRIPT
<syntaxhighlight lang="tuscript">$$ MODE TUSCRIPT
SET haystack="Zig'Zag'Wally'Ronald'Bush'Krusty'Charlie'Bush'Bozo"
SET haystack="Zig'Zag'Wally'Ronald'Bush'Krusty'Charlie'Bush'Bozo"
PRINT "haystack=",haystack
PRINT "haystack=",haystack
Line 4,051: Line 4,051:
ENDIF
ENDIF
RELEASE S_TABLE needle
RELEASE S_TABLE needle
ENDLOOP</lang>
ENDLOOP</syntaxhighlight>


{{out}}
{{out}}
Line 4,067: Line 4,067:
{{works with|pdksh}}
{{works with|pdksh}}
{{works with|Z Shell}}
{{works with|Z Shell}}
<lang sh>if [ $1 ];then
<syntaxhighlight lang="sh">if [ $1 ];then
haystack="Zip Zag Wally Ronald Bush Krusty Charlie Bush Bozo"
haystack="Zip Zag Wally Ronald Bush Krusty Charlie Bush Bozo"


Line 4,081: Line 4,081:
echo "The greatest index for $1 is: $greatest_index";fi
echo "The greatest index for $1 is: $greatest_index";fi
else echo $1 is absent from haystatck.;fi
else echo $1 is absent from haystatck.;fi
else echo Must provide string to find in haystack.;fi</lang>
else echo Must provide string to find in haystack.;fi</syntaxhighlight>


{{out}}
{{out}}
Line 4,094: Line 4,094:
If it's not present, an exception is thrown with a diagnostic message of 'missing'.
If it's not present, an exception is thrown with a diagnostic message of 'missing'.
The search is expressed by <code>~|</code>, the built-in distributing filter operator.
The search is expressed by <code>~|</code>, the built-in distributing filter operator.
<lang Ursala>#import std
<syntaxhighlight lang="ursala">#import std


indices = ||<'missing'>!% ~&nSihzXB+ ~&lrmPE~|^|/~& num</lang>
indices = ||<'missing'>!% ~&nSihzXB+ ~&lrmPE~|^|/~& num</syntaxhighlight>
The explanation is somewhat longer than the program.
The explanation is somewhat longer than the program.
* The <code>^|</code> operator takes a right operand consisting of a pair of functions <math>(f,g)</math>, and returns a function that takes a pair <math>(x,y)</math> to the result <math>(f(x),g(y))</math>.
* The <code>^|</code> operator takes a right operand consisting of a pair of functions <math>(f,g)</math>, and returns a function that takes a pair <math>(x,y)</math> to the result <math>(f(x),g(y))</math>.
Line 4,121: Line 4,121:


Test program:
Test program:
<lang Ursala>#cast %nW
<syntaxhighlight lang="ursala">#cast %nW


test = indices/'bar' <'foo','bar','baz','bar'></lang>
test = indices/'bar' <'foo','bar','baz','bar'></syntaxhighlight>
{{out}}
{{out}}
<pre>(1,3)</pre>
<pre>(1,3)</pre>


=={{header|VBA}}==
=={{header|VBA}}==
<lang vb>Function IsInArray(stringToBeFound As Variant, arr As Variant, _
<syntaxhighlight lang="vb">Function IsInArray(stringToBeFound As Variant, arr As Variant, _
Optional start As Integer = 1, Optional reverse As Boolean = False) As Long
Optional start As Integer = 1, Optional reverse As Boolean = False) As Long
'Adapted from https://stackoverflow.com/questions/12414168/use-of-custom-data-types-in-vba
'Adapted from https://stackoverflow.com/questions/12414168/use-of-custom-data-types-in-vba
Line 4,159: Line 4,159:
End If
End If
Next i
Next i
End Sub</lang>{{out}}<pre>Washington not found in haystack.
End Sub</syntaxhighlight>{{out}}<pre>Washington not found in haystack.
Bush is at position 5. And last position is 8.</pre>
Bush is at position 5. And last position is 8.</pre>


=={{header|VBScript}}==
=={{header|VBScript}}==
Shamelessly derived from the BASIC version.
Shamelessly derived from the BASIC version.
<syntaxhighlight lang="vb">
<lang vb>
data = "foo,bar,baz,quux,quuux,quuuux,bazola,ztesch,foo,bar,thud,grunt," &_
data = "foo,bar,baz,quux,quuux,quuuux,bazola,ztesch,foo,bar,thud,grunt," &_
"foo,bar,bletch,foo,bar,fum,fred,jim,sheila,barney,flarp,zxc," &_
"foo,bar,bletch,foo,bar,fum,fred,jim,sheila,barney,flarp,zxc," &_
Line 4,193: Line 4,193:
End If
End If
Loop
Loop
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>F:\VBScript>cscript /nologo search_a_list.vbs
<pre>F:\VBScript>cscript /nologo search_a_list.vbs
Line 4,219: Line 4,219:
Wart uses the function <code>pos</code> to search a list for an element.
Wart uses the function <code>pos</code> to search a list for an element.
Here's how it's implemented:
Here's how it's implemented:
<lang python>def (pos x (seq | (head ... tail)) n)
<syntaxhighlight lang="python">def (pos x (seq | (head ... tail)) n)
default n :to 0
default n :to 0
if seq
if seq
if (head = x)
if (head = x)
n
n
(pos x tail n+1)</lang>
(pos x tail n+1)</syntaxhighlight>


{{out|Usage}}
{{out|Usage}}
Line 4,234: Line 4,234:
=={{header|Wren}}==
=={{header|Wren}}==
{{libheader|Wren-seq}}
{{libheader|Wren-seq}}
<lang ecmascript>import "/seq" for Lst
<syntaxhighlight lang="ecmascript">import "/seq" for Lst


var find = Fn.new { |haystack, needle|
var find = Fn.new { |haystack, needle|
Line 4,255: Line 4,255:
System.print("The needle is %(needle).")
System.print("The needle is %(needle).")
find.call(haystack, needle)
find.call(haystack, needle)
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 4,283: Line 4,283:


=={{header|XPL0}}==
=={{header|XPL0}}==
<lang XPL0>\Based on C example:
<syntaxhighlight lang="xpl0">\Based on C example:
include c:\cxpl\stdlib; \provides StrCmp routine, etc.
include c:\cxpl\stdlib; \provides StrCmp routine, etc.
int Haystack; \('int' is used instead of 'char' for 2D array)
int Haystack; \('int' is used instead of 'char' for 2D array)
Line 4,307: Line 4,307:
Text(0, "First index for Zag: "); IntOut(0, Search("Zag", true)); CrLf(0);
Text(0, "First index for Zag: "); IntOut(0, Search("Zag", true)); CrLf(0);
Text(0, "Last index for Zag: "); IntOut(0, Search("Zag", false)); CrLf(0);
Text(0, "Last index for Zag: "); IntOut(0, Search("Zag", false)); CrLf(0);
]</lang>
]</syntaxhighlight>


{{out}}
{{out}}
Line 4,318: Line 4,318:


=={{header|Yabasic}}==
=={{header|Yabasic}}==
<lang Yabasic>list$ = "mouse,hat,cup,deodorant,television,soap,methamphetamine,severed cat heads,cup"
<syntaxhighlight lang="yabasic">list$ = "mouse,hat,cup,deodorant,television,soap,methamphetamine,severed cat heads,cup"


dim item$(1)
dim item$(1)
Line 4,337: Line 4,337:
else
else
if j > 1 print "Last index for ", line$, ": ", t
if j > 1 print "Last index for ", line$, ": ", t
end if</lang>
end if</syntaxhighlight>


=={{header|Yorick}}==
=={{header|Yorick}}==
<lang yorick>haystack = ["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Bozo"];
<syntaxhighlight lang="yorick">haystack = ["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Bozo"];
needles = ["Bush", "Washington"];
needles = ["Bush", "Washington"];
for(i = 1; i <= numberof(needles); i++) {
for(i = 1; i <= numberof(needles); i++) {
Line 4,349: Line 4,349:
if(numberof(w) > 1)
if(numberof(w) > 1)
write, format="Needle %s appears last at index %d\n", needles(i), w(0);
write, format="Needle %s appears last at index %d\n", needles(i), w(0);
}</lang>
}</syntaxhighlight>


=={{header|zkl}}==
=={{header|zkl}}==
<lang zkl>L("Krusty","Charlie","Bozo","Bozo").index("Charlie") //--> 1
<syntaxhighlight lang="zkl">L("Krusty","Charlie","Bozo","Bozo").index("Charlie") //--> 1
L("Krusty","Charlie","Bozo","Bozo").index("fred") //--> throws index error</lang>
L("Krusty","Charlie","Bozo","Bozo").index("fred") //--> throws index error</syntaxhighlight>
Find last needle:
Find last needle:
<lang zkl>haystack:=L("Krusty","Charlie","Bozo","Bozo");
<syntaxhighlight lang="zkl">haystack:=L("Krusty","Charlie","Bozo","Bozo");
haystack.filterNs('==("Bozo"))[-1]; // -->3, indexError if not found
haystack.filterNs('==("Bozo"))[-1]; // -->3, indexError if not found
haystack.len() - 1 - haystack.reverse().index("Bozo"); // or this</lang>
haystack.len() - 1 - haystack.reverse().index("Bozo"); // or this</syntaxhighlight>
Use a bit bucket of ASCIIZ strings
Use a bit bucket of ASCIIZ strings
<lang zkl>haystack:=Data(0,String,"Krusty","Charlie","Bozo","Bozo");
<syntaxhighlight lang="zkl">haystack:=Data(0,String,"Krusty","Charlie","Bozo","Bozo");
if((n:=haystack.findString("Charlie")) != Void) n else throw(Exception.IndexError);
if((n:=haystack.findString("Charlie")) != Void) n else throw(Exception.IndexError);
//-->7</lang>
//-->7</syntaxhighlight>

Revision as of 13:33, 28 August 2022

Task
Search a list
You are encouraged to solve this task according to the task description, using any language you may know.

Find the index of a string (needle) in an indexable, ordered collection of strings (haystack).

Raise an exception if the needle is missing.

If there is more than one occurrence then return the smallest index to the needle.

Extra credit

Return the largest index to a needle that has multiple occurrences in the haystack.

See also

11l

Translation of: Python
V haystack = [‘Zig’, ‘Zag’, ‘Wally’, ‘Ronald’, ‘Bush’, ‘Krusty’, ‘Charlie’, ‘Bush’, ‘Bozo’]

L(needle) (‘Washington’, ‘Bush’)
   X.try
      print(haystack.index(needle)‘ ’needle)
   X.catch ValueError
      print(needle‘ is not in haystack’)
Output:
Washington is not in haystack
4 Bush

ACL2

(defun index-of-r (e xs i)
   (cond ((endp xs) nil)
         ((equal e (first xs)) i)
         (t (index-of-r e (rest xs) (1+ i)))))

(defun index-of (e xs)
   (index-of-r e xs 0))

Action!

DEFINE PTR="CARD"

INT FUNC Search(PTR ARRAY texts INT count CHAR ARRAY text)
  INT i

  FOR i=0 TO count-1
  DO
    IF SCompare(texts(i),text)=0 THEN
      RETURN (i)
    FI
  OD
RETURN (-1)

PROC Test(PTR ARRAY texts INT count CHAR ARRAY text)
  INT index

  index=Search(texts,count,text)
  IF index=-1 THEN
    PrintF("""%S"" is not in haystack.%E",text)
  ELSE
    PrintF("""%S"" is on index %I in haystack.%E",text,index)
  FI
RETURN

PROC Main()
  PTR ARRAY texts(7)

  texts(0)="Monday"
  texts(1)="Tuesday"
  texts(2)="Wednesday"
  texts(3)="Thursday"
  texts(4)="Friday"
  texts(5)="Saturday"
  texts(6)="Sunday"

  Test(texts,7,"Monday")
  Test(texts,7,"Sunday")
  Test(texts,7,"Thursday")
  Test(texts,7,"Weekend")
RETURN
Output:

Screenshot from Atari 8-bit computer

"Monday" is on index 0 in haystack.
"Sunday" is on index 6 in haystack.
"Thursday" is on index 3 in haystack.
"Weekend" is not in haystack.

ActionScript

Using the built-in Error class

var list:Vector.<String> = Vector.<String>(["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"]);
function lowIndex(listToSearch:Vector.<String>, searchString:String):int
{
	var index:int = listToSearch.indexOf(searchString);
	if(index == -1)
		throw new Error("String not found: " + searchString);
	return index;
}

function highIndex(listToSearch:Vector.<String>, searchString:String):int
{
	var index:int = listToSearch.lastIndexOf(searchString);
	if(index == -1)
		throw new Error("String not found: " + searchString);
	return index;
}

Using a custom error

In StringNotFoundError.as:

package {
	public class StringNotFoundError extends Error {
		public function StringNotFoundError(message:String) {
			super(message);
		}
	}
}

In a separate file:

import StringNotFoundError;
var list:Vector.<String> = Vector.<String>(["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"]);
function lowIndex(listToSearch:Vector.<String>, searchString:String):int
{
	var index:int = listToSearch.indexOf(searchString);
	if(index == -1)
		throw new StringNotFoundError("String not found: " + searchString);
	return index;
}

function highIndex(listToSearch:Vector.<String>, searchString:String):int
{
	var index:int = listToSearch.lastIndexOf(searchString);
	if(index == -1)
		throw new StringNotFoundError("String not found: " + searchString);
	return index;
}

Ada

with Ada.Strings.Unbounded;  use Ada.Strings.Unbounded;
with Ada.Text_IO;            use Ada.Text_IO;

procedure Test_List_Index is
   Not_In : exception;
   
   type List is array (Positive range <>) of Unbounded_String;
   
   function Index (Haystack : List; Needle : String) return Positive is
   begin
      for Index in Haystack'Range loop
         if Haystack (Index) = Needle then
            return Index;
         end if;
      end loop;
      raise Not_In;
   end Index;

      -- Functions to create lists
   function "+" (X, Y : String) return List is
   begin
      return (1 => To_Unbounded_String (X), 2 => To_Unbounded_String (Y));
   end "+";
   
   function "+" (X : List; Y : String) return List is
   begin
      return X & (1 => To_Unbounded_String (Y));
   end "+";
   
   Haystack : List := "Zig"+"Zag"+"Wally"+"Ronald"+"Bush"+"Krusty"+"Charlie"+"Bush"+"Bozo";

   procedure Check (Needle : String) is
   begin
      Put (Needle);
      Put_Line ("at" & Positive'Image (Index (Haystack, Needle)));
   exception
      when Not_In => Put_Line (" is not in");
   end Check;
begin
   Check ("Washington");
   Check ("Bush");
end Test_List_Index;
Output:
Washington is not in
Bushat 5

Aime

void
search(list l, text s)
{
    integer i;

    i = 0;
    while (i < ~l) {
        if (l[i] == s) {
            break;
        }
        i += 1;
    }

    o_(s, " is ", i == ~l ? "not in the haystack" : "at " + itoa(i), "\n");
}

integer
main(void)
{
    list l;

    l = l_effect("Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty",
                 "Charlie", "Bush", "Boz", "Zag");
    __ucall(search, 1, 1, l, "Bush", "Washington", "Zag");

    return 0;
}
Output:
Bush is at 4
Washington is not in the haystack
Zag is at 1

ALGOL 68

Using a FORMAT "value error" exception

Works with: ALGOL 68 version Revision 1 - no extensions to language used
Works with: ALGOL 68G version Any - tested with release 1.18.0-9h.tiny
 FORMAT hay stack := $c("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo")$;
 
 FILE needle exception; STRING ref needle;
 associate(needle exception, ref needle);
 
 PROC index = (FORMAT haystack, REF STRING needle)INT:(
   INT out;
   ref needle := needle;
   getf(needle exception,(haystack, out));
   out
 );
 
 test:(
   []STRING needles = ("Washington","Bush");
   FOR i TO UPB needles DO
     STRING needle := needles[i];
     on value error(needle exception, (REF FILE f)BOOL: value error);
       printf(($d" "gl$,index(hay stack, needle), needle));
       end on value error;
     value error:
       printf(($g" "gl$,needle, "is not in haystack"));
     end on value error: reset(needle exception)
   OD
 )
Output:
Washington is not in haystack
5 Bush

Using a manual FOR loop with no exception

Works with: ALGOL 68 version Revision 1 - no extensions to language used
Works with: ALGOL 68G version Any - tested with release 1.18.0-9h.tiny
 []STRING hay stack = ("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo");
 
 PROC index = ([]STRING hay stack, STRING needle)INT:(
   INT index;
   FOR i FROM LWB hay stack TO UPB hay stack DO
     index := i;
     IF hay stack[index] = needle THEN
       found
     FI
   OD;
   else:
     LWB hay stack - 1
   EXIT
   found:
     index
 );
 test:(
   []STRING needles = ("Washington","Bush");
   FOR i TO UPB needles DO
     STRING needle := needles[i];
     INT result = index(hay stack, needle);
     IF result >= LWB hay stack THEN
       printf(($d" "gl$, result, needle))
     ELSE
       printf(($g" "gl$,needle, "is not in haystack"))
     FI
   OD
 )
Output:
Washington is not in haystack
5 Bush

Arturo

haystack: [Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo]

loop [Bush Washington] 'needle [
    i: index haystack needle

    if? empty? i    -> panic ~"|needle| is not in haystack"
    else            -> print [i needle]
]
Output:
4 Bush 
>> Error | Washington is not in haystack

AutoHotkey

haystack = Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo
needle = bush, washington
Loop, Parse, needle, `,
{
  If InStr(haystack, A_LoopField)
    MsgBox, % A_LoopField
  Else
    MsgBox % A_LoopField . " not in haystack"
}

AWK

If we use an awk array indexed with "the order" of the string, to check if the needle is in the haystack we must walk the whole array; if we use the string itself as index (in awk index for an array is indeed an hash), and put its "index" (order number in the list) as associated value, we can fastly check if the needle is in the haystack. But we can't fastly use its order number to get the string value at that position.

In the following implementation we can reach the strings by numeric index with the array haystack_byorder (so, e.g. haystack_byorder[4] gives Bush), and know the "position" of the needle (if it exists) using it as string index for the array haystack, as example does. (Beware: this method does not work when there are duplicates!)

#! /usr/bin/awk -f
BEGIN {
    # create the array, using the word as index...
    words="Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo";
    split(words, haystack_byorder, " ");
    j=0;
    for(idx in haystack_byorder) {
	haystack[haystack_byorder[idx]] = j;
	j++;
    }
    # now check for needle (we know it is there, so no "else")...
    if ( "Bush" in haystack ) {
	print "Bush is at " haystack["Bush"];
    }
    # check for unexisting needle
    if ( "Washington" in haystack ) {
	print "impossible";
    } else {
	print "Washington is not here";
    }
}

BASIC

Works with: QBasic
DATA foo, bar, baz, quux, quuux, quuuux, bazola, ztesch, foo, bar, thud, grunt
DATA foo, bar, bletch, foo, bar, fum, fred, jim, sheila, barney, flarp, zxc
DATA spqr, wombat, shme, foo, bar, baz, bongo, spam, eggs, snork, foo, bar
DATA zot, blarg, wibble, toto, titi, tata, tutu, pippo, pluto, paperino, aap
DATA noot, mies, oogle, foogle, boogle, zork, gork, bork

DIM haystack(54) AS STRING
DIM needle AS STRING, found AS INTEGER, L0 AS INTEGER

FOR L0 = 0 TO 54
    READ haystack(L0)
NEXT

DO
    INPUT "Word to search for? (Leave blank to exit) ", needle
    IF needle <> "" THEN
        FOR L0 = 0 TO UBOUND(haystack)
            IF UCASE$(haystack(L0)) = UCASE$(needle) THEN
                found = 1
                PRINT "Found "; CHR$(34); needle; CHR$(34); " at index "; LTRIM$(STR$(L0))
            END IF
        NEXT
        IF found < 1 THEN
            PRINT CHR$(34); needle; CHR$(34); " not found"
        END IF
    ELSE
        EXIT DO
    END IF
LOOP
Output:
 Word to search for? (Leave blank to exit) foo
 Found "foo" at index 0
 Found "foo" at index 8
 Found "foo" at index 12
 Found "foo" at index 15
 Found "foo" at index 27
 Found "foo" at index 34
 Word to search for? (Leave blank to exit) bar
 Found "bar" at index 1
 Found "bar" at index 9
 Found "bar" at index 13
 Found "bar" at index 16
 Found "bar" at index 28
 Found "bar" at index 35
 Word to search for? (Leave blank to exit) baz
 Found "baz" at index 2
 Found "baz" at index 29
 Word to search for? (Leave blank to exit)

IS-BASIC

100 PROGRAM "Search.bas"
110 STRING A$(1 TO 55)*8
120 FOR I=1 TO 55
130   READ A$(I)
140   PRINT A$(I);" ";
150 NEXT
160 DO
170   PRINT :INPUT PROMPT "Word to seatch for? (Leave blank to exit) ":S$
180   LET S$=LCASE$(LTRIM$(RTRIM$(S$))):LET FOUND=0
190   IF S$="" THEN EXIT DO
200   FOR I=LBOUND(A$) TO UBOUND(A$)
210     IF A$(I)=S$ THEN LET FOUND=-1:PRINT "Found """;S$;""" at index";I
220   NEXT
230   IF NOT FOUND THEN PRINT """";S$;""" not found."
240 LOOP
250 DATA foo,bar,baz,quux,quuux,quuuux,bazola,ztesch,foo,bar,thud,grunt,foo,bar,bletch,foo,bar,fum,fred,jim,sheila,barney,flarp,zxc
260 DATA spqr,wombat,shme,foo,bar,baz,bongo,spam,eggs,snork,foo,bar,zot,blarg,wibble,toto,titi,tata,tutu,pippo,pluto,paperino,aap,noot,mies,oogle,foogle,boogle,zork,gork,bork

Batch File

The index of this simple implementation is 1-based. The "haystack" data are borrowed from the BASIC implementation.

@echo off
setlocal enabledelayedexpansion

	%==Sample list==%
set "data=foo, bar, baz, quux, quuux, quuuux, bazola, ztesch, foo, bar, thud, grunt"
set "data=%data% foo, bar, bletch, foo, bar, fum, fred, jim, sheila, barney, flarp, zxc"
set "data=%data% spqr, wombat, shme, foo, bar, baz, bongo, spam, eggs, snork, foo, bar"
set "data=%data% zot, blarg, wibble, toto, titi, tata, tutu, pippo, pluto, paperino, aap"
set "data=%data% noot, mies, oogle, foogle, boogle, zork, gork, bork"

	%==Sample "needles" [whitespace is the delimiter]==%
set "needles=foo bar baz jim bong"

	%==Counting and Seperating each Data==%
set datalen=0
for %%. in (!data!) do (
	set /a datalen+=1
	set data!datalen!=%%.
)
	%==Do the search==%
for %%A in (!needles!) do (
	set "first="
	set "last="
	set "found=0"
	for /l %%B in (1,1,%datalen%) do (
		if "!data%%B!" == "%%A" (
			set /a found+=1
			if !found! equ 1 set first=%%B
			set last=%%B
		)
	)

	if !found! equ 0 echo."%%A": Not found.
	if !found! equ 1 echo."%%A": Found once in index [!first!].
	if !found! gtr 1 echo."%%A": Found !found! times. First instance:[!first!] Last instance:[!last!].

)
	%==We are done==%
echo.
pause
Output:
"foo": Found 6 times. First instance:[1] Last instance:[35].
"bar": Found 6 times. First instance:[2] Last instance:[36].
"baz": Found 2 times. First instance:[3] Last instance:[30].
"jim": Found once in index [20].
"bong": Not found.

Press any key to continue . . .

BBC BASIC

      DIM haystack$(27)
      haystack$() = "alpha","bravo","charlie","delta","echo","foxtrot","golf",   \
      \             "hotel","india","juliet","kilo","lima","mike","needle",      \
      \             "november","oscar","papa","quebec","romeo","sierra","tango", \
      \             "needle","uniform","victor","whisky","x-ray","yankee","zulu"
      
      needle$ = "needle"
      maxindex% = DIM(haystack$(), 1)
      
      FOR index% = 0 TO maxindex%
        IF needle$ = haystack$(index%) EXIT FOR
      NEXT
      IF index% <= maxindex% THEN
        PRINT "First found at index "; index%
        FOR last% = maxindex% TO 0 STEP -1
          IF needle$ = haystack$(last%) EXIT FOR
        NEXT
        IF last%<>index% PRINT "Last found at index "; last%
      ELSE
        ERROR 100, "Not found"
      ENDIF

BQN

Generally, (Index Of) is used to find the indices of the right argument array's elements in the left argument. It returns the length of the left argument 𝕨 if the argument is not present.

The given IndexOf function is written to satisfy question requirements (throwing exceptions), and it is not recommended for use in production.

list  "Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"

IndexOf  {
  ("Error: '" 𝕩 "' Not found in list") ! (𝕨)ind  𝕨⊐⋈𝕩
  ind
}

•Show list  "Wally""Hi" # intended
•Show list IndexOf "Wally"
list IndexOf "Hi"
⟨ 2 10 ⟩
2
! "Error: 'Hi' Not found in list"

  ("Error: '" ∾𝕩∾ "' Not found in list") ! (≠𝕨)≠ind ← ⊑𝕨⊐⋈𝕩
                                         ^

list IndexOf "Hi"
     ^^^^^^^

Bracmat

For both subtasks, pattern matching is used. The second subtasks proceeds in two steps. First, the first word that occurs twice is found (if it exists). Then, the last occurrence of this word is found using forced backtracking (see the ~ node) until failure.

(     return the largest index to a needle that has multiple
      occurrences in the haystack and print the needle
  : ?list
& (   !list:? haystack [?index ?
    & out$("The word 'haystack' occurs at 1-based index" !index)
  | out$"The word 'haystack' does not occur"
  )
& (   !list
    : ? %@?needle ? !needle ?
    : ( ? !needle [?index (?&~)
      |   ?
        &   out
          $ ( str
            $ ( "The word '"
                !needle
                "' occurs more than once. The last 1-based index is "
                !index
              )
            )
      )
  | out$"No word occurs more than once."
  )
);
Output:
The word 'haystack' occurs at 1-based index 14
The word 'the' occurs more than once. The last 1-based index is 17

Burlesque

blsq ) {"Zig" "Zag" "Wally" "Bush" "Ronald" "Bush"}"Bush"Fi
3

If you want all indices:

blsq ) {"Zig" "Zag" "Wally" "Bush" "Ronald" "Bush"}{"Bush"==}fI
{3 5}

C

#include <stdio.h>
#include <string.h>

const char *haystack[] = {
  "Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie",
  "Bush", "Boz", "Zag", NULL
};

int search_needle(const char *needle, const char **hs)
{
  int i = 0;
  while( hs[i] != NULL ) {
    if ( strcmp(hs[i], needle) == 0 ) return i;
    i++;
  }
  return -1;
}

int search_last_needle(const char *needle, const char **hs)
{
  int i, last=0;
  i = last = search_needle(needle, hs);
  if ( last < 0 ) return -1;
  while( hs[++i] != NULL ) {
    if ( strcmp(needle, hs[i]) == 0 ) {
      last = i;
    }
  }
  return last;
}

int main()
{
  printf("Bush is at %d\n", search_needle("Bush", haystack));
  if ( search_needle("Washington", haystack) == -1 )
    printf("Washington is not in the haystack\n");
  printf("First index for Zag: %d\n", search_needle("Zag", haystack));
  printf("Last index for Zag: %d\n", search_last_needle("Zag", haystack));
  return 0;
}
Output:
Bush is at 4
Washington is not in the haystack
First index for Zag: 1
Last index for Zag: 9

C#

using System;
using System.Collections.Generic;

class Program {
    static void Main(string[] args) {
        List<string> haystack = new List<string>() { "Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Bozo" };

        foreach (string needle in new string[] { "Washington", "Bush" }) {
            int index = haystack.IndexOf(needle);
            
            if (index < 0) Console.WriteLine("{0} is not in haystack",needle);                
            else Console.WriteLine("{0} {1}",index,needle);
        }
    }
}

C++

Works with: g++ version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

The following code shows three different ways to solve the task.

#include <string>
#include <algorithm>
#include <iterator>
#include <cstddef>
#include <exception>
#include <iostream>

// an exception to throw (actually, throwing an exception in this case is generally considered bad style, but it's part of the task)
class not_found: public std::exception
{
public:
  not_found(std::string const& s): text(s + " not found") {}
  char const* what() const throw() { return text.c_str(); }
  ~not_found() throw() {}
private:
  std::string text;
};

// needle search function, C-style interface version using standard library
std::size_t get_index(std::string* haystack, int haystack_size, std::string needle)
{
  std::size_t index = std::find(haystack, haystack+haystack_size, needle) - haystack;
  if (index == haystack_size)
    throw not_found(needle);
  else
    return index;
}

// needle search function, completely generic style, needs forward iterators
// (works with any container, but inefficient if not random-access-iterator)
template<typename FwdIter>
 typename std::iterator_traits<FwdIter>::difference_type fwd_get_index(FwdIter first, FwdIter last, std::string needle)
{
  FwdIter elem = std::find(first, last, needle);
  if (elem == last)
    throw not_found(needle);
  else
    return std::distance(first, elem);
}

// needle search function, implemented directly, needs only input iterator, works efficiently with all sequences
template<typename InIter>
 typename std::iterator_traits<InIter>::difference_type generic_get_index(InIter first, InIter last, std::string needle)
{
  typename std::iterator_traits<InIter>::difference_type index = 0;
  while (first != last && *first != needle)
  {
    ++index;
    ++first;
  }
  if (first == last)
    throw not_found(needle);
  else
    return index;
}

// ----------------------------------------------------------------------------------------------------------------------------------

// a sample haystack (content copied from Haskell example)
std::string haystack[] = { "Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Bozo" };

// some useful helper functions
template<typename T, std::size_t sz> T* begin(T (&array)[sz]) { return array; }
template<typename T, std::size_t sz> T* end(T (&array)[sz]) { return array + sz; }
template<typename T, std::size_t sz> std::size_t size(T (&array)[sz]) { return sz; }

// test function searching a given needle with each of the methods
void test(std::string const& needle)
{
  std::cout << "-- C style interface --\n";
  try
  {
    std::size_t index = get_index(haystack, size(haystack), needle);
    std::cout << needle << " found at index " << index << "\n";
  }
  catch(std::exception& exc) // better catch standard exceptions as well; me might e.g. run out of memory
  {
    std::cout << exc.what() << "\n";
  }

  std::cout << "-- generic interface, first version --\n";
  try
  {
    std::size_t index = fwd_get_index(begin(haystack), end(haystack), needle);
    std::cout << needle << " found at index " << index << "\n";
  }
  catch(std::exception& exc) // better catch standard exceptions as well; me might e.g. run out of memory
  {
    std::cout << exc.what() << "\n";
  }

  std::cout << "-- generic interface, second version --\n";
  try
  {
    std::size_t index = generic_get_index(begin(haystack), end(haystack), needle);
    std::cout << needle << " found at index " << index << "\n";
  }
  catch(std::exception& exc) // better catch standard exceptions as well; me might e.g. run out of memory
  {
    std::cout << exc.what() << "\n";
  }
}

int main()
{
  std::cout << "\n=== Word which only occurs once ===\n";
  test("Wally");
  std::cout << "\n=== Word occuring multiple times ===\n";
  test("Bush");
  std::cout << "\n=== Word not occuring at all ===\n";
  test("Goofy");
}
Output:

(note that in C++, indices start at 0)


=== Word which only occurs once ===
-- C style interface --
Wally found at index 2
-- generic interface, first version --
Wally found at index 2
-- generic interface, second version --
Wally found at index 2

=== Word occuring multiple times ===
-- C style interface --
Bush found at index 4
-- generic interface, first version --
Bush found at index 4
-- generic interface, second version --
Bush found at index 4

=== Word not occuring at all ===
-- C style interface --
Goofy not found
-- generic interface, first version --
Goofy not found
-- generic interface, second version --
Goofy not found

C++11

/* new c++-11 features
 * list class
 * initialization strings
 * auto typing
 * lambda functions
 * noexcept
 * find 
 * for/in loop
 */
 
#include <iostream>   // std::cout
#include <algorithm>  // std::find
#include <list>       // std::list
#include <vector>     // std::vector
#include <string>     // string::basic_string 


using namespace std;     // saves typing of "std::" before everything

int main()
{

  // initialization lists 
  // create objects and fully initialize them with given values

  list<string> l { "Zig", "Zag", "Wally", "Homer", "Madge", 
                   "Watson", "Ronald", "Bush", "Krusty", "Charlie", 
                   "Bush", "Bush", "Boz", "Zag" }; 
  
  list<string> n { "Bush" , "Obama", "Homer",  "Sherlock" };


  //  lambda function with auto typing
  //  auto is easier to write than looking up the complicated 
  //  specialized iterator type that is actually returned. 
  //  Just know that it returns an iterator for the list at the position found,
  //  or throws an exception if s in not in the list.
  //  runtime_error is used because it can be initialized with a message string. 

  auto contains = [](list<string> l, string s) throw(runtime_error) 
    { 
       auto r = find(begin(l), end(l), s ); 

       if( r == end(l) ) 
           throw runtime_error( s + " not found" );

       return r;
    };


  // returns an int vector with the indexes of the search string
  // The & is a "default capture" meaning that it "allows in"
  // the variables that are in scope where it is called by their
  // name to simplify things.
  
  auto index = [&](list<string> l, string s) noexcept                                         
    {  
      vector<int> index_v;  

      int idx = 0;

      for(const string& r : l)   
	{
	   if( s.compare(r) == 0 ) // match -- add to vector
               index_v.push_back(idx);
 
	   idx++;
	}
            
      // even though index_v is local to the lambda function, 
      // c++11 move semantics does what you want and returns it
      // live and intact instead of destroying it or returning a copy. 
      // (very efficient for large objects!)
      return index_v; 
    };



  // range-based for loop
  // s is a read-only reference, not a copy
  for (const string& s : n) // new iteration syntax is simple and intuitive
    { 
      try 
	{
	  
	  auto cont = contains( l , s); // checks if there is any match
	  
          if( cont != l.end() )  // found at least one
              { 
	          vector<int> vf = index( l, s );

	          cout << "l contains: " << s <<  " at " ;

	          for(auto x : vf) // auto will resolve to int  
	              { cout << x << " "; }   // if vector is empty this doesn't run

	          cout << "\n";
              }	 

      }
      catch (const runtime_error& r)  // string not found 
	{
	  cout << r.what() << "\n";
	  continue;                   // try next string
	}

    } //for
  

  return 0;

} // main

/* end */
Output:
l contains: Bush at 7 10 11 
Obama not found
l contains: Homer at 3 
Sherlock not found

Ceylon

shared test void searchAListTask() {
    value haystack = [
            "Zig", "Zag", "Wally", "Ronald", "Bush",
            "Krusty", "Charlie", "Bush", "Bozo"];

    assert(exists firstIdx = haystack.firstOccurrence("Bush"));
    assert(exists lastIdx = haystack.lastOccurrence("Bush"));

    assertEquals(firstIdx, 4);
    assertEquals(lastIdx, 7);
}

Clojure

(let [haystack ["Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Bozo"]]
  (let [idx (.indexOf haystack "Zig")]
    (if (neg? idx) 
      (throw (Error. "item not found."))
      idx)))

Extra credit: Since Clojure vectors implement java.util.List, you can switch .indexOf for .lastIndexOf to find the highest index of your value.

CLU

% Search an indexable, ordered collection.
% The collection needs to provide `indexes' and `fetch';
% the element type needs to provide `equal'.
search = proc [T, U: type] (haystack: T, needle: U) 
         returns (int) signals (not_found)
         where T has indexes: itertype (T) yields (int),
                     fetch: proctype (T,int) returns (U) signals (bounds),
               U has equal: proctype (U,U) returns (bool)
    for i: int in T$indexes(haystack) do
        if needle = haystack[i] then return (i) end
    end 
    signal not_found
end search

start_up = proc ()
    as = array[string]
    str_search = search[as,string]
    
    po: stream := stream$primary_output()
    haystack: as := as$ 
        ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
    needles: as := as$
        ["Ronald","McDonald","Bush","Obama"]
    
    for needle: string in as$elements(needles) do
        stream$puts(po, needle || ": ")
        stream$putl(po, int$unparse(str_search(haystack,needle)))
        except when not_found:
            stream$putl(po, "not found")
        end
    end
end start_up
Output:
Ronald: 4
McDonald: not found
Bush: 5
Obama: not found

COBOL

*> This is written to COBOL85, which does not include exceptions.
       IDENTIFICATION DIVISION.
       PROGRAM-ID. Search-List.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  haystack-area.
           78  Haystack-Size VALUE 10.
           03  haystack-data.
               05  FILLER     PIC X(7) VALUE "Zig".
               05  FILLER     PIC X(7) VALUE "Zag".
               05  FILLER     PIC X(7) VALUE "Wally".
               05  FILLER     PIC X(7) VALUE "Ronald".
               05  FILLER     PIC X(7) VALUE "Bush".
               05  FILLER     PIC X(7) VALUE "Krusty".
               05  FILLER     PIC X(7) VALUE "Charlie".
               05  FILLER     PIC X(7) VALUE "Bush".
               05  FILLER     PIC X(7) VALUE "Boz".
               05  FILLER     PIC X(7) VALUE "Zag".

           03  haystack-table REDEFINES haystack-data.
               05  haystack   PIC X(7) OCCURS Haystack-Size TIMES
                   INDEXED BY haystack-index.

       01  needle             PIC X(7).

       PROCEDURE DIVISION.
       main.
           MOVE "Bush" TO needle
           PERFORM find-needle

           MOVE "Goofy" TO needle
           PERFORM find-needle

*          *> Extra task
           MOVE "Bush" TO needle
           PERFORM find-last-of-needle
           
           GOBACK
           .

       find-needle.
           SEARCH haystack
               AT END
                   DISPLAY needle " not found."

               WHEN haystack (haystack-index) = needle
                   DISPLAY "Found " needle " at " haystack-index "."
           END-SEARCH
           .

       find-last-of-needle.
           PERFORM VARYING haystack-index FROM Haystack-Size BY -1
               UNTIL haystack-index = 0
               OR haystack (haystack-index) = needle
           END-PERFORM

           IF haystack-index = 0
               DISPLAY needle " not found."
           ELSE
               DISPLAY "Found last of " needle " at " haystack-index "."
           END-IF
           .
Output:
Found Bush    at +000000005.
Goofy   not found.
Found last of Bush    at +000000008.

Common Lisp

(let ((haystack '(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo)))
  (dolist (needle '(Washington Bush))
    (let ((index (position needle haystack)))
      (if index
          (progn (print index) (princ needle))
          (progn (print needle) (princ "is not in haystack"))))))
Output:
WASHINGTON is not in haystack
4 BUSH

The position function solves this task elegantly.

CL-USER> (defparameter *list* '(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo))
*LIST*
CL-USER> (position 'Bush *list*)
4
CL-USER> (position 'Bush *list* :from-end t)
7
CL-USER> (position 'Washington *list*)
NIL

D

import std.algorithm, std.range, std.string;

auto firstIndex(R, T)(R hay, T needle) {
  auto i = countUntil(hay, needle);
  if (i == -1)
    throw new Exception("No needle found in haystack");
  return i;
}

auto lastIndex(R, T)(R hay, T needle) {
  return walkLength(hay) - firstIndex(retro(hay), needle) - 1;
}

void main() {
  auto h = split("Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo");
  assert(firstIndex(h, "Bush") == 4);
  assert(lastIndex(h, "Bush") == 7);
}

Delphi

program Needle;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

var
  list: TStringList;
  needle: string;
  ind: Integer;
begin
  list := TStringList.Create;
  try
    list.Append('triangle');
    list.Append('fork');
    list.Append('limit');
    list.Append('baby');
    list.Append('needle');

    list.Sort;

    needle := 'needle';
    ind := list.IndexOf(needle);
    if ind < 0 then
      raise Exception.Create('Needle not found')
    else begin
      Writeln(ind);
      Writeln(list[ind]);
    end;

    Readln;
  finally
    list.Free;
  end;
end.
Output:
3
needle

DWScript

var haystack : array of String = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"];

function Find(what : String) : Integer;
begin
   Result := haystack.IndexOf(what);
   if Result < 0 then
      raise Exception.Create('not found');
end;

PrintLn(Find("Ronald")); // 3
PrintLn(Find('McDonald')); // exception

E

def haystack := ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]

/** meet the 'raise an exception' requirement */
def find(needle) {
    switch (haystack.indexOf1(needle)) {
        match ==(-1) { throw("an exception") }
        match index { return index }
    }
}

println(find("Ronald")) # prints 3
println(find("McDonald")) # will throw

Elena

ELENA 5.0 :

import system'routines;
import extensions;
 
public program()
{
    var haystack := new string[]{"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Bozo"};
 
    new string[]{"Washington", "Bush"}.forEach:(needle)
    {
        var index := haystack.indexOfElement:needle;
 
        if (index == -1)
        { 
            console.printLine(needle," is not in haystack")
        }
        else
        { 
            console.printLine(needle, " - ", index) 
        }
    }
}

Elixir

haystack = ~w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo)

Enum.each(~w(Bush Washington), fn needle ->
  index = Enum.find_index(haystack, fn x -> x==needle end)
  if index, do: (IO.puts "#{index} #{needle}"),
            else: raise "#{needle} is not in haystack\n"
end)
Output:
4 Bush
** (RuntimeError) Washington is not in haystack

    search.exs:5: anonymous fn/1 in :elixir_compiler_0.__FILE__/1
    (elixir) lib/enum.ex:537: Enum."-each/2-lists^foreach/1-0-"/2
    (elixir) lib/enum.ex:537: Enum.each/2
    (elixir) lib/code.ex:316: Code.require_file/2

Erlang

Erlang lists can be accessed with the function lists:nth/2, which starts at 1 (first element). As such Erlang can be considered 1-indexed for this problem. Note that you could set the indexing to 0 by modifying the function call in pos/2.

-module(index).
-export([main/0]).

main() ->
    Haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"],
    Needles = ["Washington","Bush"],
    lists:foreach(fun ?MODULE:print/1, [{N,pos(N, Haystack)} || N <- Needles]).

pos(Needle, Haystack) -> pos(Needle, Haystack, 1).
pos(_, [], _) -> undefined;
pos(Needle, [Needle|_], Pos) -> Pos;
pos(Needle, [_|Haystack], Pos) -> pos(Needle, Haystack, Pos+1).

print({Needle, undefined}) -> io:format("~s is not in haystack.~n",[Needle]);
print({Needle, Pos}) -> io:format("~s at position ~p.~n",[Needle,Pos]).
Output:
Washington is not in haystack.
Bush at position 5.

Euphoria

Works with: Euphoria version 4.0.3, 4.0.0 RC1 and later

The find_all function from the standard library's search.e does nearly all the needed work here.There may be other ways to do this using Euphoria's various sequence searching functions as part of the standard library (std/search.e) and/or built into the language. The procedure can be made into a function to search with other strings, take user input and give output of the searched haystack.

include std/search.e
include std/console.e

--the string "needle" and example haystacks to test the procedure
sequence searchStr1 = "needle"
sequence haystack1 = { "needle", "needle", "noodle", "node", "need", "needle  ", "needle" }
sequence haystack2 = {"spoon", "fork", "hay", "knife", "needle", "barn", "etcetera", "more hay", "needle", "a cow", "farmer", "needle", "dirt"}
sequence haystack3 = {"needle"}
sequence haystack4 = {"no", "need le s", "in", "this", "haystack"}
sequence haystack5 = {"knee", "needle", "dull", "needle"}
sequence haystack6 = {}

--search procedure with console output
procedure haystackSearch(sequence hStack)
    sequence foundNeedles = find_all(searchStr1, hStack)
    puts(1,"---------------------------------\r\n")
    if object(foundNeedles) and length(foundNeedles) > 0 then
        printf(1, "First needle found at index %d \r\n", foundNeedles[1])
        
        if length(foundNeedles) > 1 then
            printf(1, "Last needle found at index %d \r\n", foundNeedles[length(foundNeedles)] )
        
            for i = 1 to length(foundNeedles) do
                printf(1, "Needle #%d ", i) 
                printf(1, "was at index %d .\r\n", foundNeedles[i])
            end for
        
            else
                puts(1, "There was only one needle found in this haystack. \r\n")           
        end if
    
        else
            puts(1, "Simulated exception - No needles found in this haystack.\r\n")
    end if

end procedure

--runs the procedure on all haystacks
haystackSearch(haystack1)
haystackSearch(haystack2)
haystackSearch(haystack3)
haystackSearch(haystack4)
haystackSearch(haystack5)
haystackSearch(haystack6)
--wait for user to press a key to exit
any_key()
Output:
---------------------------------
First needle found at index 1
Last needle found at index 7
Needle #1 was at index 1 .
Needle #2 was at index 2 .
Needle #3 was at index 7 .
---------------------------------
First needle found at index 5
Last needle found at index 12
Needle #1 was at index 5 .
Needle #2 was at index 9 .
Needle #3 was at index 12 .
---------------------------------
First needle found at index 1
There was only one needle found in this haystack.
---------------------------------
Simulated exception - No needles found in this haystack.
---------------------------------
First needle found at index 2
Last needle found at index 4
Needle #1 was at index 2 .
Needle #2 was at index 4 .
---------------------------------
Simulated exception - No needles found in this haystack.
Press Any Key to continue...

F#

List.findIndex (fun x -> x = "bar") ["foo"; "bar"; "baz"; "bar"]  // -> 1
                                      // A System.Collections.Generic.KeyNotFoundException
                                      // is raised, if the predicate does not evaluate to
                                      // true for any list element.

Factor

: find-index ( seq elt -- i )
    '[ _ = ] find drop [ "Not found" throw ] unless* ; inline

: find-last-index ( seq elt -- i )
    '[ _ = ] find-last drop [ "Not found" throw ] unless* ; inline
( scratchpad ) { "a" "b" "c" "d" "c" } "c" find-index .
2
( scratchpad ) { "a" "b" "c" "d" "c" } "c" find-last-index .
4

Forth

Works with: 4tH version 3.61.5
include lib/row.4th

create haystack
  ," Zig"  ," Zag" ," Wally" ," Ronald" ," Bush" ," Krusty" ," Charlie"
  ," Bush" ," Boz" ," Zag" NULL ,
does>
  dup >r 1 string-key row 2>r type 2r> ."  is "
  if r> - ." at " . else r> drop drop ." not found" then cr
;

s" Washington" haystack s" Bush" haystack


Works with any ANS Forth

Needs the FMS-SI (single inheritance) library code located here: http://soton.mpeforth.com/flag/fms/index.html

include FMS-SI.f
include FMS-SILib.f

${ Dishonest Fake Left Karl Hillary Monica Bubba Hillary Multi-Millionaire } constant haystack

: needleIndex { addr len $list | cnt -- idx }
  0 to cnt  $list uneach:
  begin
    $list each:
  while
    @: addr len compare 0= if cnt exit then
    cnt 1+ to cnt
  repeat true abort" Not found" ;

: LastIndexOf { addr len $list | cnt last-found -- idx }
  0 to cnt 0 to last-found  $list uneach:
  begin
    $list each:
  while
    @: addr len compare 0= if cnt to last-found  then
    cnt 1+ to cnt
  repeat
  last-found if last-found
  else true abort" Not found"
  then ;
 
s" Hillary" haystack needleIndex . \ => 4
s" Hillary" haystack LastIndexOf . \ => 7
s" Washington" haystack needleIndex . \ => aborted: Not found

Fortran

program main

 implicit none

 character(len=7),dimension(10) :: haystack = [  &
  'Zig    ',&
  'Zag    ',&
  'Wally  ',&
  'Ronald ',&
  'Bush   ',&
  'Krusty ',&
  'Charlie',&
  'Bush   ',&
  'Boz    ',&
  'Zag    ']

 call find_needle('Charlie')
 call find_needle('Bush')

 contains

	subroutine find_needle(needle)
	implicit none
	character(len=*),intent(in) :: needle
	integer :: i
	do i=1,size(haystack)
		if (needle==haystack(i)) then
			write(*,'(A,I4)') trim(needle)//' found at index:',i
			return
		end if
	end do
	write(*,'(A)') 'Error: '//trim(needle)//' not found.'
	end subroutine find_needle

 end program main

FreeBASIC

FreeBASIC doesn't have exceptions so we use a different approach to check if the needle is present or not in the haystack:

' FB 1.05.0 Win64
' Works FB 1.05.0 Linux Mint 64

Function tryFindString(s() As String, search As String, ByRef index As Integer) As Boolean
  Dim length As Integer = UBound(s) - LBound(s) + 1
  If length = 0 Then
    index = LBound(s) - 1  '' outside array
    Return False
  End If
  For i As Integer = LBound(s) To UBound(s)
    If s(i) = search Then
      index = i  '' first occurrence
      Return True
    End If
  Next
  index = LBound(s) - 1  '' outside array
  Return False
End Function  

Function tryFindLastString(s() As String, search As String, ByRef index As Integer) As Boolean
  Dim length As Integer = UBound(s) - LBound(s) + 1
  If length = 0 Then
    index = LBound(s) - 1  '' outside array
    Return False
  End If
  Dim maxIndex As Integer = LBound(s) - 1  '' outside array
  For i As Integer = LBound(s) To UBound(s)
    If s(i) = search Then
      maxIndex = i
    End If
  Next
  If maxIndex > LBound(s) - 1 Then
    index = maxIndex  '' last occurrence
    Return True
  Else
    Return False
  End If
End Function  

Dim haystack(1 To 9) As String = {"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Bozo"}
Dim needle(1 To 4)   As String = {"Zag", "Krusty", "Washington", "Bush"}

Dim As Integer index
Dim As Boolean found
For i As Integer  = 1 To 4
  found = tryFindString(haystack(), needle(i), index)
  If found Then
    Print needle(i); " found first at index"; index
  Else
    Print needle(i); " is not present"
  End If
Next
found = tryFindLastString(haystack(), needle(4), index)
If found Then
  Print needle(4); " found last at index"; index
Else
  Print needle(4); " is not present"
End If
Print
Print "Press any key to quit"
Sleep
Output:
Zag found first at index 2
Krusty found first at index 6
Washington is not present
Bush found first at index 5
Bush found last at index 8

Gambas

Click this link to run this code

Public Sub Main()
Dim sHaystack As String[] = ["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"]
Dim sNeedle As String = "Charlie"
Dim sOutput As String = "No needle found!"
Dim siCount As Short

For siCount = 0 To sHaystack.Max
  If sNeedle = sHaystack[siCount] Then 
    sOutPut = sNeedle & " found at index " & Str(siCount)
    Break
  End If
Next

Print sOutput

End

Output:

Charlie found at index 6

GAP

# First position is built-in
haystack := Eratosthenes(10000);;
needle := 8999;;
Position(haystack, needle);
# 1117

LastPosition := function(L, x)
  local old, new;
  old := 0;
  new := 0;
  while new <> fail do
    new := Position(L, x, old);
    if new <> fail then
      old := new;
    fi;
  od;
  return old;
end;

a := Shuffle(List([1 .. 100], x -> x mod 10));
# [ 0, 2, 4, 5, 3, 1, 0, 4, 8, 8, 2, 7, 6, 3, 3, 6, 4, 4, 3, 0, 7, 1, 8, 7, 2, 4, 7, 9, 4, 9, 4, 5, 9, 9, 6, 7, 8, 2, 3, 
#   5, 1, 5, 4, 2, 0, 9, 6, 1, 1, 2, 2, 0, 5, 7, 6, 8, 8, 3, 1, 9, 5, 1, 9, 6, 8, 9, 2, 0, 6, 2, 1, 6, 1, 1, 2, 5, 3, 3, 
#   0, 3, 5, 7, 5, 4, 6, 8, 0, 9, 8, 3, 7, 8, 0, 4, 9, 7, 0, 6, 5, 7 ]
Position(a, 0);
# 1
LastPosition(a, 0);
# 97

See also Eratosthenes and Shuffle functions in RosettaCode.

Go

Data used by both examples below. (You can give multiple files to go run, like $ go run data.go example.go)

package main

var haystack = []string{"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty",
    "Charlie", "Bush", "Bozo", "Zag", "mouse", "hat", "cup", "deodorant",
    "television", "soap", "methamphetamine", "severed cat heads", "foo",
    "bar", "baz", "quux", "quuux", "quuuux", "bazola", "ztesch", "foo",
    "bar", "thud", "grunt", "foo", "bar", "bletch", "foo", "bar", "fum",
    "fred", "jim", "sheila", "barney", "flarp", "zxc", "spqr", ";wombat",
    "shme", "foo", "bar", "baz", "bongo", "spam", "eggs", "snork", "foo",
    "bar", "zot", "blarg", "wibble", "toto", "titi", "tata", "tutu", "pippo",
    "pluto", "paperino", "aap", "noot", "mies", "oogle", "foogle", "boogle",
    "zork", "gork", "bork", "sodium", "phosphorous", "californium",
    "copernicium", "gold", "thallium", "carbon", "silver", "gold", "copper",
    "helium", "sulfur"}

Linear search

package main

import "fmt"

func main() {
    // first task
    printSearchForward("soap")
    printSearchForward("gold")
    printSearchForward("fire")
    // extra task
    printSearchReverseMult("soap")
    printSearchReverseMult("gold")
    printSearchReverseMult("fire")
}

// First task solution uses panic as an exception-like mechanism, as requested
// by the task.  Note however, this is not idiomatic in Go and in fact
// is considered bad practice.
func printSearchForward(s string) {
    fmt.Printf("Forward search: %s: ", s)
    defer func() {
        if x := recover(); x != nil {
            if err, ok := x.(string); ok && err == "no match" {
                fmt.Println(err)
                return
            }
            panic(x)
        }
    }()
    fmt.Println("smallest index =", searchForwardPanic(s))
}

func searchForwardPanic(s string) int {
    for i, h := range haystack {
        if h == s {
            return i
        }
    }
    panic("no match")
    return -1
}

// Extra task, a quirky search for multiple occurrences.  This is written
// without panic, and shows more acceptable Go programming practice.
func printSearchReverseMult(s string) {
    fmt.Printf("Reverse search for multiples: %s: ", s)
    if i := searchReverseMult(s); i > -1 {
        fmt.Println("largest index =", i)
    } else {
        fmt.Println("no multiple occurrence")
    }
}

func searchReverseMult(s string) int {
    largest := -1
    for i := len(haystack) - 1; i >= 0; i-- {
        switch {
        case haystack[i] != s:
        case largest == -1:
            largest = i
        default:
            return largest
        }
    }
    return -1
}
Output:
Forward search: soap: smallest index = 15
Forward search: gold: smallest index = 77
Forward search: fire: no match
Reverse search for multiples: soap: no multiple occurrence
Reverse search for multiples: gold: largest index = 81
Reverse search for multiples: fire: no multiple occurrence

Map lookup

More efficient, if you're doing lots of lookups, is to build a map. This example doesn't completely conform to the task but gives the idea that you could store indexes as map values.

package main

import "fmt"

func main() {
    m := map[string][]int{}
    for i, needle := range haystack {
        m[needle] = append(m[needle], i)
    }
    for _, n := range []string{"soap", "gold", "fire"} {
        fmt.Println(n, m[n])
    }
}
Output:
soap [15]
gold [77 81]
fire []

Groovy

def haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
def needles = ["Washington","Bush","Wally"]
needles.each { needle ->
    def index = haystack.indexOf(needle)
    def lastindex = haystack.lastIndexOf(needle)
    if (index < 0) {
        assert lastindex < 0 
        println needle + " is not in haystack"
    } else {
        println "First index: " + index + " " + needle
        println "Last index:  " + lastindex + " " + needle
    }
}
Output:
Washington is not in haystack
First index: 4 Bush
Last index:  7 Bush
First index: 2 Wally
Last index:  2 Wally

Haskell

Libraries and data:

import Data.List

haystack=["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
needles = ["Washington","Bush"]

I use 'lambda' notation for readability.

Find 'just' an index:
*Main> map (\x -> (x,elemIndex x haystack)) needles
[("Washington",Nothing),("Bush",Just 4)]

Want to know if there are there more Bushes hiding in the haystack?

*Main> map (\x -> (x,elemIndices x haystack)) needles
[("Washington",[]),("Bush",[4,7])]

To be complete. Here is the 'point free' version of the task:

*Main> ((,) <*> flip elemIndex haystack) <$> needles
[("Washington",Nothing),("Bush",Just 4)]

HicEst

CHARACTER haystack='Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo.'
CHARACTER needle*10

DLG(TItle="Enter search string", Edit=needle)

n = EDIT(Text=haystack, Option=2, End, Count=needle) ! Option = word

IF( n == 0 ) THEN
  WRITE(Messagebox="!") needle, "not found"    ! bus not found
ELSE
  first = EDIT(Text=needle, LeXicon=haystack)
  WRITE(ClipBoard) "First ", needle, "found in position ", first
  ! First bush      found in position 5

  last = EDIT(Text=haystack, End, Left=needle, Count=" ") + 1
  WRITE(ClipBoard) "Last ", needle, "found in position ", last
  ! Last bush      found in position 8
ENDIF

Icon and Unicon

link lists

procedure main()              
haystack := ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]  # the haystack
every needle := !["Bush","Washington"] do {                                         # the needles

   if i := lindex(haystack,needle) then {                                           # first occurrence 
      write("needle=",needle, " is at position ",i," in haystack.")                

      if i <:= last(lindex,[haystack,needle]) then                                  # last occurrence 
         write("needle=",needle, " is at last position ",i," in haystack.")         
      }
   else {
      write("needle=",needle, " is not in haystack.")
      runerr(500,needle)        # throw an error
      }
   }

end

procedure last(p,arglist)               #: return the last generation of p(arglist) or fail
local i
every i := p!arglist
return \i
end

Taken from the public domain Icon Programming Library's lindex in lists which generates list indices for x of any type

procedure lindex(lst, x)		#: generate indices for items matching x
   local i

   every i := 1 to *lst do
      if lst[i] === x then suspend i

end
Output:
needle=Bush is at position 5 in haystack.
needle=Bush is at last position 8 in haystack.
needle=Washington is not in haystack.

Run-time error 500
File haystack.icn; Line 7
program malfunction
offending value: "Washington"
Traceback:
   main(list_1 = [])
   runerr(500,"Washington") from line 7 in haystack.icn

Io

List has a indexOf method which does not raise an exception on lookup failure but returns nil therefore I extend List with a firstIndex method that does raise an exception. I also create a lastIndex extension that finds the last index of a matching object by iterating in reverse over the list. Note that all these methods find any object not just strings.

NotFound := Exception clone
List firstIndex := method(obj,
    indexOf(obj) ifNil(NotFound raise)
)
List lastIndex := method(obj,
    reverseForeach(i,v,
        if(v == obj, return i)
    )
    NotFound raise
)

haystack := list("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo")
list("Washington","Bush") foreach(needle,
    try(
        write("firstIndex(\"",needle,"\"): ")
        writeln(haystack firstIndex(needle))
    )catch(NotFound,
        writeln(needle," is not in haystack")
    )pass
    try(
        write("lastIndex(\"",needle,"\"): ")
        writeln(haystack lastIndex(needle))
    )catch(NotFound,
        writeln(needle," is not in haystack")
    )pass
)
Output:
firstIndex("Washington"): Washington is not in haystack
lastIndex("Washington"): Washington is not in haystack
firstIndex("Bush"): 4
lastIndex("Bush"): 7

J

J has a general and optimized lookup function, i.

For example:

   Haystack =: ;:'Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo'
   Needles  =: ;:'Washington Bush'
    
   Haystack i. Needles     NB. first positions
9 4
   Haystack i: Needles     NB. last positions
9 7

Note that the arguments to i. can be anything (ie either or both may be scalars, lists, multidimensional arrays, etc). Nonmatches get a result of 1+largest valid index.

Other search primitives include:

e. finds whether items are members of a set, returning a bitmask to select the members:

   Needles e. Haystack
0 1
   1 2 3 4 5 6 7 8 9 e. 2 3 5 60
0 1 1 0 1 0 0 0 0

I. finds indices, but performs a binary search (which requires that the list being searched is sorted). This can be useful for finding non-exact matches (the index of the next value is returned for non-exact matches).

   1 2 3 4 5 6 7 8 9 I. 2 3 5 60 6.66
1 2 4 9 6
   (;:'eight five four nine one seven six three two') I. ;:'two three five sixty'
8 7 1 7

To format output similar to the other examples, one might write:

    Haystack ;:^:_1@(] ,. [ ((<'is not in haystack')"_)`(#@[ I.@:= ])`(8!:0@])} i.) Needles
Washington is not in haystack
Bush 4

Or broken up into components and defined as a verb/function for finding the last positions:

   msg=: (<'is not in haystack')"_                  NB. not found message
   idxmissing=: #@[ I.@:= ]                         NB. indices of items not found
   fmtdata=: 8!:0@]                                 NB. format atoms as boxed strings
   findLastIndex=: ;:inv@(] ,. [ msg`idxmissing`fmtdata} i:)

   Haystack findLastIndex Needles                   NB. usage
Washington is not in haystack
Bush 7

To elaborate a bit: Array-oriented languages (like J) consume the input and produce the output in toto.

That is, all the results are produced simultaneously; consequently, throwing an exception for any part of the input would prohibit producing any output at all.

And while it is both possible and simple to treat the input item by item, this is significantly slower and loses the great advantage of array processing.

Therefore these languages generally produce a special, but conforming, output for "bad" inputs (in this case, an index past the end of the list). Then the functions which consume these outputs may be left untouched (as the special outputs are already in their domain) or may be extended simply.

In this case, there is only one function which formats and prints the results, and its treatment of "good" and "bad" outputs is identical (it cannot distinguish the two). It is simply that the outputs of previous functions have been arranged such that the results are conformable.

Java

for Lists, they have an indexOf() method:

import java.util.List;
import java.util.Arrays;

List<String> haystack = Arrays.asList("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo");

for (String needle : new String[]{"Washington","Bush"}) {
    int index = haystack.indexOf(needle);
    if (index < 0)
        System.out.println(needle + " is not in haystack");
    else
        System.out.println(index + " " + needle);
}

for arrays, you have to do it manually:

import java.util.Arrays;
 
String[] haystack = { "Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"};

for (String needle : new String[]{"Washington","Bush"}) {
    int index = Arrays.binarySearch(haystack, needle);
    if (index < 0)
        System.out.println(needle + " is not in haystack");
    else
        System.out.println(index + " " + needle);
}
Output:
Washington is not in haystack
4 Bush

JavaScript

var haystack = ['Zig', 'Zag', 'Wally', 'Ronald', 'Bush', 'Krusty', 'Charlie', 'Bush', 'Bozo']
var needles = ['Bush', 'Washington']

for (var i in needles) {
    var found = false;
    for (var j in haystack) {
        if (haystack[j] == needles[i]) {
            found = true;
            break;
        }
    }
    if (found)
        print(needles[i] + " appears at index " + j + " in the haystack");
    else
        throw needles[i] + " does not appear in the haystack"
}

The following

Works with: JavaScript version 1.6

:

for each (var needle in needles) {
    var idx = haystack.indexOf(needle);
    if (idx == -1)
        throw needle + " does not appear in the haystack"
    else
        print(needle + " appears at index " + idx + " in the haystack");
}

// extra credit

for each (var elem in haystack) {
    var first_idx = haystack.indexOf(elem);
    var last_idx  = haystack.lastIndexOf(elem);
    if (last_idx > first_idx) {
        print(elem + " last appears at index " + last_idx + " in the haystack");
        break
    }
}


Or, generalising enough (in ES5) to allow for varying definitions of the type of match we are looking for:

(function () {

  function findIndex(fnPredicate, list) {
    for (var i = 0, lng = list.length; i < lng; i++) {
      if (fnPredicate(list[i])) {
        return i;
      }
    }
    return Error("not found");
  };

  // DEFINING A PARTICULAR TYPE OF SEARCH MATCH
  
  function matchCaseInsensitive(s, t) {
    return s.toLowerCase() === t.toLowerCase();
  }

  var lstHaystack = [
    'Zig', 'Zag', 'Wally', 'Ronald', 'Bush',
    'Krusty', 'Charlie', 'Bush', 'Bozo'
  ],
    lstReversed = lstHaystack.slice(0).reverse(),
    iLast = lstHaystack.length - 1,
    lstNeedles = ['bush', 'washington'];

  return {
    'first': lstNeedles.map(function (s) {
      return [s, findIndex(function (t) {
          return matchCaseInsensitive(s, t);
        },
        lstHaystack)];
    }),

    'last': lstNeedles.map(function (s) {
      var varIndex = findIndex(function (t) {
          return matchCaseInsensitive(s, t);
        },
        lstReversed);

      return [
        s,
        typeof varIndex === 'number' ?
          iLast - varIndex : varIndex
      ];
    })
  }
})();

Output:

{
  "first": [
    [
      "bush",
      4
    ],
    [
      "washington",
      "Error: not found"
    ]
  ],
  "last": [
    [
      "bush",
      7
    ],
    [
      "washington",
      "Error: not found"
    ]
  ]
}

jq

The jq index origin is 0. The relevant methods for the tasks at hand are index/1 and rindex/1; indices/1 can also be used.

In the following, the output is shown after the "# =>":

["a","b","c"] | index("b")
# => 1

["a","b","c","b"] | index("b")
# => 1

["a","b","c","b"]
  | index("x") // error("element not found")
# => jq: error: element not found

# Extra task - the last element of an array can be retrieved
# using `rindex/` or by using -1 as an index into the array produced by `indices/1`:
["a","b","c","b","d"] | rindex("b")
# => 3

["a","b","c","b","d"] | indices("b")[-1]
# => 3

Julia

Works with: Julia version 0.6
@show findfirst(["no", "?", "yes", "maybe", "yes"], "yes")
@show indexin(["yes"], ["no", "?", "yes", "maybe", "yes"])
@show findin(["no", "?", "yes", "maybe", "yes"], ["yes"])
@show find(["no", "?", "yes", "maybe", "yes"] .== "yes")
Output:
findfirst(["no", "?", "yes", "maybe", "yes"], "yes") = 3
indexin(["yes"], ["no", "?", "yes", "maybe", "yes"]) = [5]
findin(["no", "?", "yes", "maybe", "yes"], ["yes"]) = [3, 5]
find(["no", "?", "yes", "maybe", "yes"] .== "yes") = [3, 5]

K

  Haystack:("Zig";"Zag";"Wally";"Ronald";"Bush";"Krusty";"Charlie";"Bush";"Bozo")    
  Needles:("Washington";"Bush")
  {:[y _in x;(y;x _bin y);(y;"Not Found")]}[Haystack]'Needles
Output:
(("Washington"
  "Not Found")
 ("Bush"
  4))

Additional: If more than one occurrence ("Bush"), also show position of the last occurrence. Here we use the dyadic verb _sm (string match) instead of _bin (binary search).

  Haystack2: Haystack,,"Bush"
  Needles2:Needles,,"Zag"
  {+(x;{:[#&x;,/?(*&x;*|&x);"Not found"]}'+x _sm/:y)}[Needles2;Haystack2]
Output:
(("Washington"
  "Not found")
 ("Bush"
  4 9)
 ("Zag"
  1))

Kotlin

// version 1.0.6 (search_list.kt)

fun main(args: Array<String>) {
    val haystack = listOf("Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag")
    println(haystack)
    var needle = "Zag"
    var index  = haystack.indexOf(needle)
    val index2 = haystack.lastIndexOf(needle)
    println("\n'$needle' first occurs at index $index of the list")
    println("'$needle' last  occurs at index $index2 of the list\n")
    needle = "Donald"
    index  = haystack.indexOf(needle)
    if (index == -1) throw Exception("$needle does not occur in the list")
}
Output:
[Zig, Zag, Wally, Ronald, Bush, Krusty, Charlie, Bush, Boz, Zag]

'Zag' first occurs at index 1 of the list
'Zag' last  occurs at index 9 of the list

Exception in thread "main" java.lang.Exception: Donald does not occur in the list
        at Search_listKt.main(search_list.kt:13)

Lang5

: haystack(*)  ['rosetta 'code 'search 'a 'list 'lang5 'code] find-index ;
: find-index
    2dup eq length iota swap select swap drop
    length if swap drop
    else drop " is not in haystack" 2 compress "" join
    then ;
: ==>search  apply ;

['hello 'code] 'haystack ==>search .
Output:
[ hello is not in haystack
  [    1     6  ]
]

Lasso

Lasso arrays have a findindex method which returns all matching indexes. [1]

local(haystack) = array('Zig', 'Zag', 'Wally', 'Ronald', 'Bush', 'Krusty', 'Charlie', 'Bush', 'Bozo')

#haystack->findindex('Bush')->first // 5
#haystack->findindex('Bush')->last // 8

protect => {^
    handle_error => {^ error_msg ^}
        fail_if(not #haystack->findindex('Washington')->first,'Washington is not in haystack.')
^}
Output:
5
8
Washington is not in haystack.

Liberty BASIC

haystack$="apple orange pear cherry melon peach banana needle blueberry mango strawberry needle "
haystack$=haystack$+"pineapple grape kiwi blackberry plum raspberry needle cranberry apricot"

idx=1
do until word$(haystack$,idx)=""
idx=idx+1
loop
total=idx-1

needle$="needle"
'index of first occurrence
for i = 1 to total
    if word$(haystack$,i)=needle$ then exit for
next
print needle$;" first found at index ";i

'index of last occurrence
for j = total to 1
    if word$(haystack$,j)=needle$ then exit for
next
print needle$;" last found at index ";j
if i<>j then
    print "Multiple instances of ";needle$
    else
    print "Only one instance of ";needle$;" in list."
end if

'raise exception
needle$="cauliflower"
for k=1 to total
    if word$(haystack$,k)=needle$ then exit for
next
if k>total then
    print needle$;" not found in list."
else
    print needle$;" found at index ";k
end if

Lingo

haystack = ["apples", "oranges", "bananas", "oranges"]
needle = "oranges"

pos = haystack.getPos(needle)
if pos then
  put "needle found at index "&pos
else
  put "needle not found in haystack"
end if

-- "needle found at index 2"

Lisaac

+ haystack : ARRAY[STRING];
haystack := "Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo".split;
"Washington Bush".split.foreach { needle : STRING;
  haystack.has(needle).if {
    haystack.first_index_of(needle).print;
    ' '.print;
    needle.print;
    '\n'.print;
  } else {
    needle.print;
    " is not in haystack\n".print;
  };
};

to indexof :item :list
  if empty? :list [(throw "NOTFOUND 0)]
  if equal? :item first :list [output 1]
  output 1 + indexof :item butfirst :list
end

to showindex :item :list
  make "i catch "NOTFOUND [indexof :item :list]
  ifelse :i = 0 [(print :item [ not found in ] :list)] [(print :item [ found at position ] :i [ in ] :list)]
end

showindex "dog [My dog has fleas]   ; dog found at position 2 in My dog has fleas
showindex "cat [My dog has fleas]   ; cat not found in My dog has fleas

Lua

list = {"mouse", "hat", "cup", "deodorant", "television", "soap", "methamphetamine", "severed cat heads"} --contents of my desk

item = io.read()

for i,v in ipairs(list)
  if v == item then print(i) end
end

M2000 Interpreter

Example based on BASIC's example, changed to find only first occurrence, and last if a second exist. We make one inventory queue which can take sane keys, and a second one with all keys in reverse order. Search works with hash table inside inventory. Normally we use Exist(inventoryA, "key") and if it is true then we get the value as Eval(inventoryA) without using second search, by temporary use of an index. We can read that index by making a variable to bind a property of COM object (the object under the inventory).

Module Checkit {
      Flush ' empty stack
      Inventory Queue Haystack=  "foo", "bar", "baz", "quux", "quuux", "quuuux", "bazola", "ztesch", "foo", "bar", "thud", "grunt"
      Append  Haystack, "foo", "bar", "bletch", "foo", "bar", "fum", "fred", "jim", "sheila", "barney", "flarp", "zxc"
      Append  Haystack,  "spqr", "wombat", "shme", "foo", "bar", "baz", "bongo", "spam", "eggs", "snork", "foo", "bar"
      Append  Haystack,  "zot", "blarg", "wibble", "toto", "titi", "tata", "tutu", "pippo", "pluto", "paperino", "aap"
      Append  Haystack,  "noot", "mies", "oogle", "foogle", "boogle", "zork", "gork", "bork"
      \\ Inventories are objects and we have access to properties using COM model 
      With HayStack, "index" as index
      Inventory Queue HayStackRev
      N=Each(HayStack, -1, 1)
      While N {
            Append HayStackRev, Eval$(N, N^)
      }
      With HayStackRev, "index" as indexRev
      Print Len(HayStack)
      Print Len(HayStackRev)
      local needle$
      \\ Print all elements using columns
      Print haystack
      Repeat {
                Input "Word to search for? (Leave blank to exit) ", needle$
                If needle$ <> "" Then {
                          If Exist(haystackrev,lcase$(needle$) ) Then {
                              Print "Found "; CHR$(34); needle$; CHR$(34); " at index "; STR$(len(haystackrev)-indexrev,"")
                              
                              If Exist(haystack,lcase$(needle$) ) Then  {
                                    if len(haystackrev)-1<>indexrev+index then {
                                                Print "Found "; CHR$(34); needle$; CHR$(34); " at index "; STR$(Len(haystack)-index,"")
                                    }
                              }
                        } Else  Print CHR$(34); needle$; CHR$(34); " not found"    
            } Else Exit
      } Always     
}
CheckIt

Extra-Extra: Find all occurrences displaying the indexes for each one.

Module CheckThis {      
      Inventory Queue Haystack=  "foo", "bar", "baz", "quux", "quuux", "quuuux", "bazola", "ztesch", "foo", "bar", "thud", "grunt"
      Append  Haystack, "foo", "bar", "bletch", "foo", "bar", "fum", "fred", "jim", "sheila", "barney", "flarp", "zxc"
      Append  Haystack,  "spqr", "wombat", "shme", "foo", "bar", "baz", "bongo", "spam", "eggs", "snork", "foo", "bar"
      Append  Haystack,  "zot", "blarg", "wibble", "toto", "titi", "tata", "tutu", "pippo", "pluto", "paperino", "aap"
      Append  Haystack,  "noot", "mies", "oogle", "foogle", "boogle", "zork", "gork", "bork"
      \\ Print all list
      Print Haystack
      \\ inventory queue can get same keys
      \\ inventory use hashtable.
      \\ Inventory put same keys in a linked list, so we can found easy
      Do
             Input "Word to search for? (Leave blank press enter to exit) ", needle$
             if needle$="" then exit
             n=1
             s$=lcase$(needle$)
             While exist(Haystack, s$, n)
                    \\ number, key  and position (zero based convert to one based)
                    Print n, Eval$(HayStack!), Eval(HayStack!)+1
                    n++
             End While
             If n=1 Then Print needle$;" not found"
      Always
}
CheckThis

Maple

haystack := ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]:
occurences := ListTools:-SearchAll(needle,haystack):
try
	#first occurence
	printf("The first occurence is at index %d\n", occurences[1]);
	#last occurence, note that StringTools:-SearchAll()retuns a list of all occurences positions
	printf("The last occurence is at index %d\n", occurences[-1]);
catch :
	print("Erros: Needle not found in the haystack"):
end try:
Examples:

needle := "Washington":

"Needle not found in the haystack"

needle := "Bush":

The first occurence is at index 5
The last occurence is at index 8

Mathematica/Wolfram Language

This examples shows you the first appearance, the last appearance, and all appearances (as a list):

haystack = {"Zig","Zag","Wally","Ronald","Bush","Zig","Zag","Krusty","Charlie","Bush","Bozo"};
needle = "Zag";
first = Position[haystack,needle,1][[1,1]]
last = Position[haystack,needle,1][[-1,1]]
all = Position[haystack,needle,1][[All,1]]

gives back:

2
7
{2,7}

MATLAB

Collections of strings are stored in cell arrays in MATLAB. The solution bellow will only work for a cell array of this construction:

stringCollection = {'string1','string2',...,'stringN'}

It will not work for any other construction, for example:

stringCollection = {{'string1'},{'string2'},{...},{'stringN'}}

searchCollection.m:

function index = searchCollection(list,searchItem,firstLast)
    
    %firstLast is a string containing either 'first' or 'last'. The 'first'
    %flag will cause searchCollection to return the index of the first
    %instance of the item being searched. 'last' will cause
    %searchCollection to return the index of the last instance of the item
    %being searched.
    
    indicies = cellfun(@(x)x==searchItem,list);
    index = find(indicies,1,firstLast);
    assert(~isempty(index),['The string ''' searchItem ''' does not exist in this collection of strings.']);

end
Output:
>> list = {'a','b','c','d','e','c','f','c'};
>> searchCollection(list,'c','first')

ans =

     3

>> searchCollection(list,'c','last')

ans =

     8

>> searchCollection(list,'g','last')
??? Error using ==> searchCollection at 11
The string 'g' does not exist in this collection of strings.

Maxima

haystack: ["Zig","Zag","Wally","Ronald","Bush","Zig","Zag","Krusty","Charlie","Bush","Bozo"];
needle:  "Zag";

findneedle(needle, haystack, [opt]):=block([idx],
  idx: sublist_indices(haystack, lambda([w], w=needle)),
  if emptyp(idx) then throw('notfound),
  if emptyp(opt) then return(idx),
  opt: first(opt),
  if opt='f then first(idx) else if opt='l then last(idx) else throw('unknownmode));
Usage:
(%i32) catch(findneedle("Zag", haystack, 'f));
(%o32)                                 2
(%i33) catch(findneedle("Zag", haystack, 'l));
(%o33)                                 7
(%i34) catch(findneedle("Washington", haystack));
(%o34)                             notfound
(%i35) catch(findneedle("Bush", haystack, 'f));
(%o35)                                 5
(%i36) catch(findneedle("Zag", haystack));
(%o36)                              [2, 7]
(%i37) catch(findneedle("Zag", haystack, 'l));
(%o37)                                 7

MAXScript

haystack=#("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo")

for needle in #("Washington","Bush") do
(
    index = findItem haystack needle
    
    if index == 0 then
    (
        format "% is not in haystack\n" needle
    )
    else
    (
        format "% %\n" index needle
    )
)
Output:
Washington is not in haystack
5 Bush

Nanoquery

Translation of: Python
$haystack = list()
append $haystack "Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie"
append $haystack "Bush" "Bozo"

$needles = list()
append $needles "Washington"
append $needles "Bush"

for ($i = 0) ($i < len($needles)) ($i = $i + 1)
	$needle = $needles[$i]
	try
		// use array lookup syntax to get the index of the needle
		println $haystack[$needle] + " " + $needle
	catch
		println $needle + " is not in haystack"
	end
end for
Output:
Washington is not in haystack
4 Bush

NetRexx

/* NetRexx */
options replace format comments java crossref symbols nobinary

driver(arg) -- call the test wrapper
return

-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method searchListOfWords(haystack, needle, forwards = (1 == 1), respectCase = (1 == 1)) public static signals Exception

  if \respectCase then do
    needle   = needle.upper()
    haystack = haystack.upper()
    end
  if forwards then wp = haystack.wordpos(needle)
  else             wp = haystack.words() - haystack.reverse().wordpos(needle.reverse()) + 1
  if wp = 0 then signal Exception('*** Error! "'needle'" not found in list ***')

  return wp

-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method searchIndexedList(haystack, needle, forwards = (1 == 1), respectCase = (1 == 1)) public static signals Exception
  if forwards then do
    strtIx = 1
    endIx  = haystack[0]
    incrIx = 1
    end
  else do
    strtIx = haystack[0]
    endIx  = 1
    incrIx = -1
    end

    wp = 0
    loop ix = strtIx to endIx by incrIx
      if respectCase then 
        if needle == haystack[ix] then wp = ix
        else nop
      else
        if needle.upper() == haystack[ix].upper() then wp = ix
        else nop
      if wp > 0 then leave ix
      end ix
    if wp = 0 then signal Exception('*** Error! "'needle'" not found in indexed list ***')

  return wp

-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Test wrapper
method driver(arg) public static
  -- some manifests
  TRUE_        = (1 == 1); FALSE_      = \TRUE_
  FORWARDS_    = TRUE_;    BACKWARDS_  = FALSE_
  CASERESPECT_ = TRUE_;    CASEIGNORE_ = \CASERESPECT_
  
  -- test data
  needles = ['barley', 'quinoa']
  
  -- a simple list of words.  Lists of words are indexable in NetRexx via the word(N) function
  hayrick = 'Barley maize barley sorghum millet wheat rice rye barley Barley oats flax'
  
  -- a Rexx indexed string made up from the words in hayrick
  cornstook = ''
  loop w_ = 1 to hayrick.words() -- populate the indexed string
    cornstook[0]  = w_
    cornstook[w_] = hayrick.word(w_)
    end w_
  
  loop needle over needles
    do -- process the list of words
      say 'Searching for "'needle'" in the list "'hayrick'"'
      idxF = searchListOfWords(hayrick, needle)
      idxL = searchListOfWords(hayrick, needle, BACKWARDS_)
      say '  The first occurence of "'needle'" is at index' idxF 'in the list'
      say '  The last occurence of "'needle'" is at index' idxL 'in the list'
      idxF = searchListOfWords(hayrick, needle, FORWARDS_, CASEIGNORE_)
      idxL = searchListOfWords(hayrick, needle, BACKWARDS_, CASEIGNORE_)
      say '  The first caseless occurence of "'needle'" is at index' idxF 'in the list'
      say '  The last caseless occurence of "'needle'" is at index' idxL 'in the list'
      say
    catch ex = Exception
      say '  'ex.getMessage()
      say
    end
  
    do -- process the indexed list
      corn = ''
      loop ci = 1 to cornstook[0]
        corn = corn cornstook[ci]
        end ci
      say 'Searching for "'needle'" in the indexed list "'corn.space()'"'
      idxF = searchIndexedList(cornstook, needle)
      idxL = searchIndexedList(cornstook, needle, BACKWARDS_)
      say '  The first occurence of "'needle'" is at index' idxF 'in the indexed list'
      say '  The last occurence of "'needle'" is at index' idxL 'in the indexed list'
      idxF = searchIndexedList(cornstook, needle, FORWARDS_, CASEIGNORE_)
      idxL = searchIndexedList(cornstook, needle, BACKWARDS_, CASEIGNORE_)
      say '  The first caseless occurence of "'needle'" is at index' idxF 'in the indexed list'
      say '  The last caseless occurence of "'needle'" is at index' idxL 'in the indexed list'
      say
    catch ex = Exception
      say '  'ex.getMessage()
      say
    end
    end needle
  
  return
Output:
Searching for "barley" in the list "Barley maize barley sorghum millet wheat rice rye barley Barley oats flax"
  The first occurence of "barley" is at index 3 in the list
  The last occurence of "barley" is at index 9 in the list
  The first caseless occurence of "barley" is at index 1 in the list
  The last caseless occurence of "barley" is at index 10 in the list

Searching for "barley" in the indexed list "Barley maize barley sorghum millet wheat rice rye barley Barley oats flax"
  The first occurence of "barley" is at index 3 in the indexed list
  The last occurence of "barley" is at index 9 in the indexed list
  The first caseless occurence of "barley" is at index 1 in the indexed list
  The last caseless occurence of "barley" is at index 10 in the indexed list

Searching for "quinoa" in the list "Barley maize barley sorghum millet wheat rice rye barley Barley oats flax"
  *** Error! "quinoa" not found in list ***

Searching for "quinoa" in the indexed list "Barley maize barley sorghum millet wheat rice rye barley Barley oats flax"
  *** Error! "quinoa" not found in indexed list ***

Nim

let haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]

for needle in ["Bush", "Washington"]:
  let f = haystack.find(needle)
  if f >= 0:
    echo f, " ", needle
  else:
    raise newException(ValueError, needle & " not in haystack")
Output:
4 Bush
[...]/search_a_list.nim(8) search_a_list
Error: unhandled exception: Washington not in haystack [ValueError]

Objeck

use Collection;

class Test {
  function : Main(args : String[]) ~ Nil {
    haystack := ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"];
    values := CompareVector->New();
    each(i : haystack) {
      values->AddBack(haystack[i]->As(Compare));
    };

    needles := ["Washington", "Bush"];
    each(i : needles) {
      values->Has(needles[i]->As(Compare))->PrintLine();
    };
  }
}

Objective-C

Works with: Objective-C version 2.0+
NSArray *haystack = @[@"Zig",@"Zag",@"Wally",@"Ronald",@"Bush",@"Krusty",@"Charlie",@"Bush",@"Bozo"];
for (id needle in @[@"Washington",@"Bush"]) {
    int index = [haystack indexOfObject:needle];
    if (index == NSNotFound)
        NSLog(@"%@ is not in haystack", needle);
    else
        NSLog(@"%i %@", index, needle);
}

OCaml

# let find_index pred lst =
    let rec loop n = function
       []    -> raise Not_found
     | x::xs -> if pred x then n
                          else loop (n+1) xs
    in
    loop 0 lst;;
val find_index : ('a -> bool) -> 'a list -> int = <fun>

# let haystack =
    ["Zig";"Zag";"Wally";"Ronald";"Bush";"Krusty";"Charlie";"Bush";"Bozo"];;
val haystack : string list =
  ["Zig"; "Zag"; "Wally"; "Ronald"; "Bush"; "Krusty"; "Charlie"; "Bush";
   "Bozo"]
# List.iter (fun needle ->
               try
                 Printf.printf "%i %s\n" (find_index ((=) needle) haystack) needle
               with Not_found ->
                 Printf.printf "%s is not in haystack\n" needle)
            ["Washington"; "Bush"];;
Washington is not in haystack
4 Bush
- : unit = ()

Oforth

indexOf returns null if an object is not into a collection, not an exception.

: needleIndex(needle, haystack)
   haystack indexOf(needle) dup ifNull: [ drop ExRuntime throw("Not found", needle) ] ;

[ "Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz" ] const: Haystack

needleIndex("Bush", Haystack) println
Haystack lastIndexOf("Bush") println
needleIndex("Washington", Haystack) println
Output:
5
8
[1:interpreter] ExRuntime : Not found <Washington>

ooRexx

All ooRexx collections support an index method that will search for an item. For ordered collections, this will always be the first item. For unordered collections, the index returned is undetermined.

-- ordered collections always return the first hit
a = .array~of(1,2,3,4,4,5)
say a~index(4)
a2 = .array~new(5,5)  -- multidimensional
a2[3,3] = 4
-- the returned index is an array of values
say a2~index(4)~makestring('line', ',')
-- Note, list indexes are assigned when an item is added and
-- are not tied to relative position
l = .list~of(1,2,3,4,4,5)
say l~index(4)
q = .queue~of(1,2,3,4,4,5)
say q~index(4)
-- directories are unordered, so it is
-- undertermined which one is returned
d = .directory~new
d["foo"] = 4
d["bar"] = 4
say d~index(4)

Oz

No such function exists for the built-in list type (the operation is quite inefficient, after all). A possible implementation:

declare
  %% Lazy list of indices of Y in Xs.
  fun {Indices Y Xs}
     for
        X in Xs
        I in 1;I+1
        yield:Yield
     do
        if Y == X then {Yield I} end
     end
  end

  fun {Index Y Xs}
     case {Indices Y Xs} of X|_ then X
     else raise index(elementNotFound Y) end
     end
  end

  Haystack = ["Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Bozo"] 
in
  {Show {Index "Bush" Haystack}}
  {Show {List.last {Indices "Bush" Haystack}}}

  {Show {Index "Washington" Haystack}} %% throws

PARI/GP

Works with: PARI/GP version 2.4.3 and above
find(v,n)={
  my(i=setsearch(v,n));
  if(i,
    while(i>1, if(v[i-1]==n,i--))
  ,
    error("Could not find")
  );
  i
};

Pascal

See Delphi

Perl

use List::Util qw(first);

my @haystack = qw(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);

foreach my $needle (qw(Washington Bush)) {
  my $index = first { $haystack[$_] eq $needle } (0 .. $#haystack); # note that "eq" was used because we are comparing strings
                                                                    # you would use "==" for numbers
  if (defined $index) {
    print "$index $needle\n";
  } else {
    print "$needle is not in haystack\n";
  }
}
Output:
Washington is not in haystack
4 Bush

You could install a non-standard module List::MoreUtils:

use List::MoreUtils qw(first_index);

my @haystack = qw(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);

foreach my $needle (qw(Washington Bush)) {
  my $index = first_index { $_ eq $needle } @haystack; # note that "eq" was used because we are comparing strings
                                                       # you would use "==" for numbers
  if (defined $index) {
    print "$index $needle\n";
  } else {
    print "$needle is not in haystack\n";
  }
}

Alternatively, if you need to do this a lot, you could create a hash table mapping values to indices in the haystack:

my @haystack = qw(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);

my %haystack_indices;
@haystack_indices{ @haystack } = (0 .. $#haystack); # Caution: this finds the largest index, not the smallest

foreach my $needle (qw(Washington Bush)) {
  my $index = $haystack_indices{$needle};
  if (defined $index) {
    print "$index $needle\n";
  } else {
    print "$needle is not in haystack\n";
  }
}
Output:
Washington is not in haystack
7 Bush

Phix

Library: Phix/basics
constant s = {"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"}
 
integer r = find("Zag",s)       ?r  -- 2    (first)
r = find("Zag",s,r+1)           ?r  -- 10   (next)
r = find("Zag",s,r+1)           ?r  -- 0    (no more)
r = rfind("Zag",s)              ?r  -- 10   (last)
r = find("Zog",s)               ?r  -- 0    (none)

Phixmonti

"mouse" "hat" "cup" "deodorant" "television"
"soap" "methamphetamine" "severed cat heads" "cup"
pstack
stklen tolist reverse
0 tolist var t

"Enter string to search: " input var s nl
true
while
    head s == if
        len t swap 0 put var t
    endif
    tail nip len
endwhile
drop

t len not if
    "String not found in list" print
else
    reverse
    "First index for " print s print " : " print 1 get print
    len 1 > if
        nl "Last index for " print s print " : " print len get print
    endif
endif
drop

Other solution with syntactic sugar for list construction.

include Utilitys.pmt

0 var acum
0 var p
"Zag" var word

def search
    word find var p p
enddef

( "Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Boz" "Zag" )

dup print nl nl

search
while
    p acum + var acum
    ( word " located in position " acum ) lprint nl
    len p - p 1 + swap slice nip
    search
endwhile

PHP

$haystack = array("Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo");

foreach (array("Washington","Bush") as $needle) {
  $i = array_search($needle, $haystack);
  if ($i === FALSE) // note: 0 is also considered false in PHP, so you need to specifically check for FALSE
    echo "$needle is not in haystack\n";
  else
    echo "$i $needle\n";
}
Output:
Washington is not in haystack
4 Bush

Picat

Picat has built-in functions find_first_of/2 and find_last_of/2. They return -1 if the needle is not found, so here they are wrapped in functions that throws exceptions in this case.

And Picat is 1-based.

import util.

go =>
  Haystack=["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Bush", "Charlie", "Bush", "Boz", "Zag"],

  println("First 'Bush'"=search_list(Haystack,"Bush")),
  println("Last 'Bush'"=search_list_last(Haystack,"Bush")),

  println("All 'Bush'"=search_list_all(Haystack,"Bush")),

  catch(WaldoIx=search_list(Haystack,"Waldo"),E,println(E)),
  println("Waldo"=WaldoIx),

  nl.

% Wrapping find_first_of/2 and find_last_of/2 with exceptions
search_list(Haystack,Needle) = Ix =>
  Ix = find_first_of(Haystack,Needle),
  if Ix < 0 then
    throw $error(search_list(Needle),not_found)
  end.

search_list_last(Haystack,Needle) = Ix =>
  Ix = find_last_of(Haystack,Needle),
  if Ix < 0 then
    throw $error(search_list_last(Needle),not_found)
  end.

% Find all indices
search_list_all(Haystack,Needle) = Ixs =>
  Ixs = [Ix : {W,Ix} in zip(Haystack,1..Haystack.len), W == Needle],
  if Ixs == [] then
    throw $error(search_list_all(Needle),not_found)
  end.
Output:
First 'Bush' = 5
Last 'Bush' = 9
All 'Bush' = [5,7,9]
error(search_list(Waldo),not_found)
Waldo = _3590


PicoLisp

Note that in PicoLisp all indexes are one-based (the first element has the position '1')

(de lastIndex (Item Lst)
   (- (length Lst) (index Item (reverse Lst)) -1) )

(de findNeedle (Fun Sym Lst)
   (prinl Sym " " (or (Fun Sym Lst) "not found")) )

(let Lst '(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo)
   (findNeedle index 'Washington Lst)
   (findNeedle index 'Bush Lst)
   (findNeedle lastIndex 'Bush Lst) )
Output:
Washington not found
Bush 5
Bush 8

PL/I

search: procedure () returns (fixed binary);
   declare haystack (0:9) character (200) varying static initial
      ('apple', 'banana', 'celery', 'dumpling', 'egg', 'flour',
       'grape', 'pomegranate', 'raisin', 'sugar' );
   declare needle character (200) varying;
   declare i fixed binary;
   declare missing_needle condition;

   on condition(missing_needle) begin;
      put skip list ('your string ''' || needle ||
         ''' does not exist in the haystack.');
   end;

   put ('Please type a string');
   get edit (needle) (L);
   do i = lbound(haystack,1) to hbound(haystack,1);
      if needle = haystack(i) then return (i);
   end;
   signal condition(missing_needle);
   return (lbound(haystack,1)-1);
end search;

Plain English

To run:
Start up.
Make an example haystack.
Find "b" in the example haystack giving a count.
Destroy the example haystack.
Write "The index of ""b"" is " then the count on the console.
Wait for the escape key.
Shut down.

A needle is a string.

Some hay is some strings.

A bale is a thing with some hay.

A haystack is some bales.

To add some hay to a haystack:
Allocate memory for a bale.
Put the hay into the bale's hay.
Append the bale to the haystack.

To make an example haystack:
Add "a" to the example haystack.
Add "a" to the example haystack.
Add "b" to the example haystack.
Add "c" to the example haystack.
Add "d" to the example haystack.

\ As Plain English doesn't have exceptions, return -1 if the needle is not found.
To find a needle in a haystack giving a count:
Get a bale from the haystack.
Loop.
If the bale is nil, put -1 into the count; exit.
If the bale's hay is the needle, exit.
Put the bale's next into the bale.
Bump the count.
Repeat.
Output:
The index of "b" is 2

PowerBASIC

FUNCTION PBMAIN () AS LONG
    DIM haystack(54) AS STRING
    ARRAY ASSIGN haystack() = "foo", "bar", "baz", "quux", "quuux", "quuuux", _
                 "bazola", "ztesch", "foo", "bar", "thud", "grunt", "foo", _
                 "bar", "bletch", "foo", "bar", "fum", "fred", "jim", _
                 "sheila", "barney", "flarp", "zxc", "spqr", ";wombat", "shme", _
                 "foo", "bar", "baz", "bongo", "spam", "eggs", "snork", "foo", _
                 "bar", "zot", "blarg", "wibble", "toto", "titi", "tata", _
                 "tutu", "pippo", "pluto", "paperino", "aap", "noot", "mies", _
                 "oogle", "foogle", "boogle", "zork", "gork", "bork"
    DIM needle AS STRING, found AS LONG, lastFound AS LONG
    DO
        needle = INPUTBOX$("Word to search for? (Leave blank to exit)")
        IF needle <> "" THEN
            ' collate ucase -> case insensitive
            ARRAY SCAN haystack(), COLLATE UCASE, = needle, TO found
            IF found > 0 THEN
                lastFound = found
                MSGBOX "Found """ & needle & """ at index " & TRIM$(STR$(found - 1))
                IF found < UBOUND(haystack) THEN
                    DO
                        ARRAY SCAN haystack(lastFound), COLLATE UCASE, = needle, TO found
                        IF found > 0 THEN
                            MSGBOX "Another occurence of """ & needle & """ at index " & _
                                   TRIM$(STR$(found + lastFound - 1))
                            lastFound = found + lastFound
                        ELSE
                            MSGBOX "No more occurences of """ & needle & """ found"
                            EXIT DO 'will exit inner DO, not outer
                        END IF
                    LOOP
                END IF
            ELSE
                MSGBOX "No occurences of """ & needle & """ found"
            END IF
        ELSE
            EXIT DO
        END IF
    LOOP
END FUNCTION

PowerShell

Works with: PowerShell version 4.0
function index($haystack,$needle) {
    $index = $haystack.IndexOf($needle)
    if($index -eq -1) {
        Write-Warning "$needle is absent"
    } else {
        $index
    }
    
}
$haystack = @("word", "phrase", "preface", "title", "house", "line", "chapter", "page", "book", "house")
index $haystack "house"
index $haystack "paragraph"

Output:

4
WARNING: paragraph is absent

PowerShell Extra credit

The -Verbose switch is available to any advanced function.

function Find-Needle
{
    [CmdletBinding()]
    [OutputType([int])]
    Param
    (
        [Parameter(Mandatory=$true, Position=0)]
        [string]
        $Needle,

        [Parameter(Mandatory=$true, Position=1)]
        [string[]]
        $Haystack,

        [switch]
        $LastIndex
    )

    if ($LastIndex)
    {
        $index = [Array]::LastIndexOf($Haystack,$Needle)

        if ($index -eq -1)
        {
            Write-Verbose "Needle not found in Haystack"
            return $index
        }
        
        if ((($Haystack | Group-Object | Where-Object Count -GT 1).Group).IndexOf($Needle) -ne -1)
        {
            Write-Verbose "Last needle found in Haystack at index $index"
        }
        else
        {
            Write-Verbose "Needle found in Haystack at index $index  (No duplicates were found)"
        }

        return $index
    }
    else
    {
        $index = [Array]::IndexOf($Haystack,$Needle)

        if ($index -eq -1)
        {
            Write-Verbose "Needle not found in Haystack"
        }
        else
        {
            Write-Verbose "Needle found in Haystack at index $index"
        }

        return $index
    }
}

$haystack = @("word", "phrase", "preface", "title", "house", "line", "chapter", "page", "book", "house")
Find-Needle "house" $haystack
Output:
4
Find-Needle "house" $haystack -Verbose
Output:
VERBOSE: Needle found in Haystack at index 4
4
Find-Needle "house" $haystack -LastIndex -Verbose
Output:
VERBOSE: Last needle found in Haystack at index 9
9
Find-Needle "title" $haystack -LastIndex -Verbose
Output:
VERBOSE: Needle found in Haystack at index 3  (No duplicates were found)
3
Find-Needle "something" $haystack -Verbose
Output:
VERBOSE: Needle not found in Haystack
-1

Prolog

Works with SWI-Prolog

search_a_list(N1, N2) :-
	L = ["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"],

	write('List is :'), maplist(my_write, L), nl, nl,

	(   nth1(Ind1, L, N1) ->
	    format('~s is in position ~w~n', [N1, Ind1])
	;   format('~s is not present~n', [N1])),
	(   nth1(Ind2, L, N2) ->
	    format('~s is in position ~w~n', [N2, Ind2])
	;   format('~s is not present~n', [N2])),
	(   reverse_nth1(Ind3, L, N1) ->
	    format('~s last position is ~w~n', [N1, Ind3])
	;   format('~s is not present~n', [N1])).

reverse_nth1(Ind, L, N) :-
	reverse(L, RL),
	length(L, Len),
	nth1(Ind1, RL, N),
	Ind is Len - Ind1 + 1.

my_write(Name) :-
	writef(' %s', [Name]).
Output:
 ?- search_a_list("Zag", "Simpson").
List is : Zig Zag Wally Ronald Bush Krusty Charlie Bush Boz Zag

Zag is in position 2
Simpson is not present
Zag last position is 10
true.

PureBasic

If OpenConsole()  ; Open a simple console to interact with user
  NewList Straws.s()
  Define Straw$, target$="TBA"
  Define found
  
  Restore haystack ; Read in all the straws of the haystack.
  Repeat
    Read.s Straw$
    If Straw$<>""
      AddElement(Straws())
      Straws()=UCase(Straw$)
      Continue
    Else
      Break 
    EndIf
  ForEver
  
  While target$<>""
    Print(#CRLF$+"Enter word to search for (leave blank to quit) :"): target$=Input()
    ResetList(Straws()): found=#False
    While NextElement(Straws())
      If UCase(target$)=Straws()
        found=#True
        PrintN(target$+" found as index #"+Str(ListIndex(Straws())))
      EndIf  
    Wend
    If Not found
      PrintN("Not found.")
    EndIf
  Wend 
EndIf
 
DataSection
  haystack:
  Data.s "Zig","Zag","Zig","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo",""
EndDataSection

Python

haystack=["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]

for needle in ("Washington","Bush"):
  try:
    print haystack.index(needle), needle
  except ValueError, value_error:
    print needle,"is not in haystack"
Output:
Washington is not in haystack
4 Bush

Note that in Python, the index method of a list already raises an exception. The following shows the default information given when the exception is not captured in the program:

>>> haystack=["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
>>> haystack.index('Bush')
4
>>> haystack.index('Washington')
Traceback (most recent call last):
  File "<pyshell#95>", line 1, in <module>
    haystack.index('Washington')
ValueError: list.index(x): x not in list
>>>

There is no built-in method for returning the highest index of a repeated string in a Python list, tuple or array, (although strings have rindex). Instead we need to look for the index in the reversed list and adjust the result.

>>> def hi_index(needle, haystack):
	return len(haystack)-1 - haystack[::-1].index(needle)

>>> # Lets do some checks
>>> for n in haystack:
	hi = hi_index(n, haystack)
	assert haystack[hi] == n, "Hi index is of needle"
	assert n not in haystack[hi+1:], "No higher index exists"
	if haystack.count(n) == 1:
		assert hi == haystack.index(n), "index == hi_index if needle occurs only once"

>>>

R

find.needle <- function(haystack, needle="needle", return.last.index.too=FALSE)
{
   indices <- which(haystack %in% needle)
   if(length(indices)==0) stop("no needles in the haystack")
   if(return.last.index.too) range(indices) else min(indices)
}

Example usage:

haystack1 <- c("where", "is", "the", "needle", "I", "wonder")
haystack2 <- c("no", "sewing", "equipment", "in", "here")
haystack3 <- c("oodles", "of", "needles", "needles", "needles", "in", "here")

find.needle(haystack1)                              # 4
find.needle(haystack2)                              # error
find.needle(haystack3)                              # 3
find.needle(haystack3, needle="needles", ret=TRUE)  # 3 5

Racket

The function index returns the index of the the element x in the sequence xs. If the element is not found, then #f is returned.

(define (index xs y)
  (for/first ([(x i) (in-indexed xs)]
              #:when (equal? x y))
    i))

If the last index of an element is needed, for/last is used:

(define (index-last xs y)
  (for/last ([(x i) (in-indexed xs)]
             #:when (equal? x y))
    i))

Both index and index-last can handle any sequence such as lists, vectors, sets etc. Let us test with a linked list:

(define haystack '("Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Bozo"))

(for/list ([needle '("Bender" "Bush")])   
    (index haystack needle))

(for/list ([needle '("Bender" "Bush")])  
    (index-last haystack needle))
Output:
'(#f 4)
'(#f 7)

Raku

(formerly Perl 6)

Works with: Rakudo Star version 2016.07
my @haystack = <Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo>;
 
for <Washington Bush> -> $needle {
    say "$needle -- { @haystack.first($needle, :k) // 'not in haystack' }";
}
Output:
Washington -- not in haystack
Bush -- 4


Or, including the "extra credit" task:

Works with: Rakudo Star version 2016.07
my Str @haystack = <Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo>;

for <Washingston Bush> -> $needle {
    my $first = @haystack.first($needle, :k);

    if defined $first {
        my $last = @haystack.first($needle, :k, :end);
        say "$needle -- first at $first, last at $last";
    }
    else {
        say "$needle -- not in haystack";
    }
}
Output:
Washingston -- not in haystack
Bush -- first at 4, last at 7

The built-in method .first takes a smart-matcher, and returns the first matching list element.
The :k adverb tells it to return the key (a.k.a. list index) instead of the value of the matching element.
The :end adverb tells it to start searching from the end of the list.


If you plan to do many searches on the same large list, you might want to build a search hash first for efficient look-up:

my @haystack = <Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo>;

my %index;
%index{.value} //= .key for @haystack.pairs;

for <Washington Bush> -> $needle {
    say "$needle -- { %index{$needle} // 'not in haystack' }";
}

REBOL

REBOL [
	Title: "List Indexing"
	URL: http://rosettacode.org/wiki/Index_in_a_list
]

locate: func [
	"Find the index of a string (needle) in string collection (haystack)."
	haystack [series!] "List of values to search."
	needle [string!] "String to find in value list."
	/largest "Return the largest index if more than one needle."
	/local i
][
	i: either largest [
		find/reverse tail haystack needle][find haystack needle]
	either i [return index? i][
		throw reform [needle "is not in haystack."]
	]
]

; Note that REBOL uses 1-base lists instead of 0-based like most
; computer languages. Therefore, the index provided will be one
; higher than other results on this page.

haystack: parse "Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo" none

print "Search for first occurance:"
foreach needle ["Washington" "Bush"] [
	print catch [
		reform [needle "=>" locate haystack needle]
	]
]

print [crlf "Search for last occurance:"]
foreach needle ["Washington" "Bush"] [
	print catch [
		reform [needle "=>" locate/largest haystack needle]
	]
]
Output:
Search for first occurance:
Washington is not in haystack.
Bush => 5

Search for last occurance:
Washington is not in haystack.
Bush => 8

REXX

version 1

This REXX program searches a collection of string (haystack) that are stored in a sequential REXX array.

No counter is kept of the number of items, but they should be numbered consecutively and can't have any gaps.

The haystack items may have any character, including blanks.
A null value isn't allowed in this method of representing values.

/*REXX program searches a collection of strings   (an array of periodic table elements).*/
hay.=                                            /*initialize the haystack collection.  */
hay.1  = 'sodium'
hay.2  = 'phosphorous'
hay.3  = 'californium'
hay.4  = 'copernicium'
hay.5  = 'gold'
hay.6  = 'thallium'
hay.7  = 'carbon'
hay.8  = 'silver'
hay.9  = 'curium'
hay.10 = 'copper'
hay.11 = 'helium'
hay.12 = 'sulfur'

needle = 'gold'                                  /*we'll be looking for the gold.       */
upper needle                                     /*in case some people capitalize stuff.*/
found=0                                          /*assume the needle isn't found yet.   */

          do j=1  while hay.j\==''               /*keep looking in the haystack.        */
          _=hay.j;     upper _                   /*make it uppercase to be safe.        */
          if _=needle  then do;  found=1         /*we've found the needle in haystack.  */
                                 leave           /*   ··· and stop looking, of course.  */
                            end
          end   /*j*/

if found  then return j                          /*return the haystack  index  number.  */
          else say  needle  "wasn't found in the haystack!"
return 0                                         /*indicates the needle  wasn't  found. */

version 2

This REXX program searches a collection of string (haystack) that are stored in a REXX array (which may have gaps).

A safe counter is kept of the maximum (highest) index in the array, this counter may be any sufficiently high number.

The array may be out of order (but not recommended!).

/*REXX program searches a collection of strings   (an array of periodic table elements).*/
hay.0   =      1000                              /*safely indicate highest item number. */
hay.200 = 'Binilnilium'
hay.98  = 'californium'
hay.6   = 'carbon'
hay.112 = 'copernicium'
hay.29  = 'copper'
hay.114 = 'flerovium'
hay.79  = 'gold'
hay.2   = 'helium'
hay.1   = 'hydrogen'
hay.82  = 'lead'
hay.116 = 'livermorium'
hay.15  = 'phosphorous'
hay.47  = 'silver'
hay.11  = 'sodium'
hay.16  = 'sulfur'
hay.81  = 'thallium'
hay.92  = 'uranium'
                                                 /* [↑]  sorted by the element name.    */
needle  = 'gold'                                 /*we'll be looking for the gold.       */
upper needle                                     /*in case some people capitalize.      */
found=0                                          /*assume the needle isn't found  (yet).*/

          do j=1  for hay.0                      /*start looking in haystack,  item 1.  */
          _=hay.j;     upper _                   /*make it uppercase just to be safe.   */
          if _=needle  then do;  found=1         /*we've found the needle in haystack.  */
                                 leave           /*  ··· and stop looking, of course.   */
                            end
          end   /*j*/

if found  then return j                          /*return the haystack  index  number.  */
          else say  needle  "wasn't found in the haystack!"
return 0                                         /*indicates the needle  wasn't  found. */

version 3

This REXX program searches a collection of string (haystack) that are stored in a REXX array.

This form uses a type of array called a sparse array   (with non-numeric indexes).

One drawback of this approach is that the items can't have leading/trailing/imbedded blanks,
nor can they have special characters.

Only letters, numerals, and a few special characters are allowed:   !,   @,   #,   $,   ?,   and   _.

This method (finding a needle in a haystack) is extremely fast as there isn't any
table look-up, the "finding" is done by REXX's own internal method of variable lookup,
and, for the most part, it based on a table hashing algorithm.

This method pre-prends an underscore (underbar) to avoid collision with any REXX
variable names. Therefore, there shouldn't be any REXX variable names (in this
program) that have a leading underscore   (_).

/*REXX program searches a collection of strings   (an array of periodic table elements).*/
hay.=0                                           /*initialize the haystack collection.  */
hay._sodium       = 1
hay._phosphorous  = 1
hay._californium  = 1
hay._copernicium  = 1
hay._gold         = 1
hay._thallium     = 1
hay._carbon       = 1
hay._silver       = 1
hay._copper       = 1
hay._helium       = 1
hay._sulfur       = 1
                                                 /*underscores (_) are used to NOT ...  */
                                                 /*   ... conflict with variable names. */

needle  = 'gold'                                 /*we'll be looking for the gold.       */

Xneedle = '_'needle                              /*prefix an underscore (_)  character. */
upper Xneedle                                    /*uppercase:  how REXX stores them.    */

                                                 /*alternative version of above:        */
                                                 /*       Xneedle=translate('_'needle)  */

found=hay.Xneedle                                /*this is it, it's found (or maybe not)*/

if found  then return j                          /*return the haystack  index  number.  */
          else say  needle  "wasn't found in the haystack!"
return 0                                         /*indicates the needle  wasn't  found. */

version 4

This method uses a simple string (so haystack items can't have embedded blanks or tabs in them).
Code was added to uppercase both the   haystack   and the   needle   to make the search   case insensitive.

/*REXX program searches a collection of strings   (an array of periodic table elements).*/
    /*───────────────names of the first 200 elements of the periodic table.─────────────*/
_=  'hydrogen helium lithium beryllium boron carbon nitrogen oxygen fluorine neon sodium'
_=_ 'magnesium aluminum silicon phosphorous sulfur chlorine argon potassium calcium'
_=_ 'scandium titanium vanadium chromium manganese iron cobalt nickel copper zinc'
_=_ 'gallium germanium arsenic selenium bromine krypton rubidium strontium yttrium'
_=_ 'zirconium niobium molybdenum technetium ruthenium rhodium palladium silver cadmium'
_=_ 'indium tin antimony tellurium iodine xenon cesium barium lanthanum cerium'
_=_ 'praseodymium neodymium promethium samarium europium gadolinium terbium dysprosium'
_=_ 'holmium erbium thulium ytterbium lutetium hafnium tantalum tungsten rhenium osmium'
_=_ 'iridium platinum gold mercury thallium lead bismuth polonium astatine radon'
_=_ 'francium radium actinium thorium protactinium uranium neptunium plutonium americium'
_=_ 'curium berkelium californium einsteinium fermium mendelevium nobelium lawrencium'
_=_ 'rutherfordium dubnium seaborgium bohrium hassium meitnerium darmstadtium'
_=_ 'roentgenium copernicium nihonium flerovium moscovium livermorium tennessine'
_=_ 'oganesson ununennium unbinilium unbiunium unbibium unbitrium unbiquadium'
_=_ 'unbipentium unbihexium unbiseptium unbioctium unbiennium untrinilium untriunium'
_=_ 'untribium untritrium untriquadium untripentium untrihexium untriseptium untrioctium'
_=_ 'untriennium unquadnilium unquadunium unquadbium unquadtrium unquadquadium'
_=_ 'unquadpentium unquadhexium unquadseptium unquadoctium unquadennium unpentnilium'
_=_ 'unpentunium unpentbium unpenttrium unpentquadium unpentpentium unpenthexium'
_=_ 'unpentseptium unpentoctium unpentennium unhexnilium unhexunium unhexbium unhextrium'
_=_ 'unhexquadium unhexpentium unhexhexium unhexseptium unhexoctium unhexennium'
_=_ 'unseptnilium unseptunium unseptbium unsepttrium unseptquadium unseptpentium'
_=_ 'unsepthexium unseptseptium unseptoctium unseptennium unoctnilium unoctunium'
_=_ 'unoctbium unocttrium unoctquadium unoctpentium unocthexium unoctseptium unoctoctium'
_=_ 'unoctennium unennilium unennunium unennbium unenntrium unennquadium unennpentium'
_=_ 'unennhexium unennseptium unennoctium unennennium binilnilium'

haystack= _                                      /*assign the elements ───►  haystack.  */
needle  = 'gold'                                 /*we'll be looking for the gold.       */
upper needle haystack                            /*in case some people capitalize stuff.*/
idx= wordpos(needle, haystack)                   /*use REXX's BIF:  WORDPOS             */
if idx\==0  then return idx                      /*return the haystack  index  number.  */
            else say  needle  "wasn't found in the haystack!"
return 0                                         /*indicates the needle  wasn't  found. */
                                                 /*stick a fork in it,  we're all done. */

Ring

haystack = ["alpha","bravo","charlie","delta","echo","foxtrot","golf",   
"hotel","india","juliet","kilo","lima","mike","needle",
"november","oscar","papa","quebec","romeo","sierra","tango", 
"needle","uniform","victor","whisky","x-ray","yankee","zulu"]

needle = "needle"
maxindex = len(haystack)
 
for index = 1 to maxindex
    if needle = haystack[index] exit ok
next
if index <= maxindex 
   see "first found at index " + index + nl ok
for last = maxindex to 0 step -1
    if needle = haystack[last] exit ok
next
if !=index see " last found at index " + last + nl
else see "not found" + nl ok

Output:

first found at index : 14
 last found at index : 22

Ruby

haystack = %w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo)

%w(Bush Washington).each do |needle|
  if (i = haystack.index(needle))
    puts "#{i} #{needle}"
  else
    raise "#{needle} is not in haystack\n"
  end
end
Output:
4 Bush
search_a_list.rb:8:in `block in <main>': Washington is not in haystack (RuntimeError)
	from search_a_list.rb:4:in `each'
	from search_a_list.rb:4:in `<main>'

Extra credit

haystack.each do |item| 
  last = haystack.rindex(item)
  if last > haystack.index(item)
    puts "#{item} last appears at index #{last}"
    break
  end
end
#=> Bush last appears at index 7

or

multi_item = haystack.each_index.group_by{|idx| haystack[idx]}.select{|key, val| val.length > 1}
# multi_item is => {"Bush"=>[4, 7]}
multi_item.each do |key, val|
  puts "#{key} appears at index #{val}"
end
#=> Bush appears at index [4, 7]

Run BASIC

haystack$ = ("Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo Bush ")
needle$   = "Zag Wally Bush Chicken"

while word$(needle$,i+1," ") <> ""
  i  = i + 1
  thisNeedle$ = word$(needle$,i," ") + " "
  j  = instr(haystack$,thisNeedle$)
  k1 = 0
  k  = instr(haystack$,thisNeedle$,j+1) 
  while k <> 0
    k1 = k
    k  = instr(haystack$,thisNeedle$,k+1) 
  wend
  if j <> 0 then  
    print thisNeedle$;" located at:";j; 
    if k1 <> 0 then print " Last position located at:";k1;
    print 
   else 
    print thisNeedle$;" is not in the list"
  end if
wend
Output:
Zag  located at:5
Wally  located at:9
Bush  located at:22 Last position located at:52
Chicken  is not in the list

Rust

Rust encourages to encode possible errors in function's return type. For example, position returns Option<usize>, which can be None or Some(x).

fn main() {
    let haystack=vec!["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", 
                        "Bush", "Boz", "Zag"];

    println!("First occurence of 'Bush' at {:?}",haystack.iter().position(|s| *s=="Bush"));
    println!("Last occurence of 'Bush' at {:?}",haystack.iter().rposition(|s| *s=="Bush"));
    println!("First occurence of 'Rob' at {:?}",haystack.iter().position(|s| *s=="Rob"));
}
Output:
First occurence of 'Bush' at Some(4)
Last occurence of 'Bush' at Some(7)
First occurence of 'Rob' at None

Version that panics

fn main() {
    let haystack=vec!["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", 
                        "Bush", "Boz", "Zag"];

    println!("First occurence of 'Bush' at {:?}",haystack.iter().position(|s| *s=="Bush").unwrap());
    println!("Last occurence of 'Bush' at {:?}",haystack.iter().rposition(|s| *s=="Bush").unwrap());
    println!("First occurence of 'Rob' at {:?}",haystack.iter().position(|s| *s=="Rob").unwrap());
}
Output:
First occurence of 'Bush' at 4
Last occurence of 'Bush' at 7
thread '<main>' panicked at 'called `Option::unwrap()` on a `None` value', /home/rustbuild/src/rust-buildbot/slave/stable-dist-rustc-linux/build/src/libcore/option.rs:362
playpen: application terminated with error code 101

S-lang

variable haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo","Ronald"];
 
define find(needle)
{
    variable i = where(haystack == needle);
    if (length(i)) {
       % print(sprintf("%s: first=%d, last=%d", needle, i[0], i[-1]));
       return(i[0], i[-1]);
    }
    else
       throw ApplicationError, "an exception";
}
 
($1, $2) = find("Ronald");     % returns 3, 9
($1, $2) = find("McDonald");   % throws ApplicationError, labelled "an exception"

Sather

Translation of: C_sharp
class MAIN is
   main is
      haystack :ARRAY{STR} := |"Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Bozo"|;
      needles :ARRAY{STR} := | "Washington", "Bush" |;
      loop needle ::= needles.elt!;
	 index ::= haystack.index_of(needle);
	 if index < 0 then
	    #OUT + needle + " is not in the haystack\n";
	 else
	    #OUT + index + " " + needle + "\n";
	 end;
      end;
   end;
end;

Scala

The method indexOf, defined for all classes inheriting from, or having an implicit conversion to, Seq returns the index of the first element, or -1 if none exists. The method lastIndexOf does the same for the last element. Neither throws an exception, but that's easily done afterwards.

However, a simple implementation, not using those or similar methods might be written like this:

def findNeedles(needle: String, haystack: Seq[String]) = haystack.zipWithIndex.filter(_._1 == needle).map(_._2)
def firstNeedle(needle: String, haystack: Seq[String]) = findNeedles(needle, haystack).head
def lastNeedle(needle: String, haystack: Seq[String]) = findNeedles(needle, haystack).last

It does raise an exception if there's no needle.

Scheme

(define haystack
  '("Zig" "Zag" "Wally" "Ronald" "Bush" "Krusty" "Charlie" "Bush" "Bozo"))

(define index-of
  (lambda (needle hackstack)
    (let ((tail (member needle haystack)))
      (if tail
          (- (length haystack) (length tail))
          (throw 'needle-missing)))))

(define last-index-of
  (lambda (needle hackstack)
    (let ((tail (member needle (reverse haystack))))
      (if tail
          (- (length tail) 1)
          (throw 'needle-missing)))))
Output:
(index-of "Bush" haystack)
4
(last-index-of "Bush" haystack)
7

SenseTalk

put ("apple", "banana", "cranberry" ,"durian", "eggplant", "grape", "banana", "appl", "blackberry") into fruitList

put findInList(fruitList,"banana")  // 2
put findInList(fruitList,"banana", true)  // 7
put findInList(fruitList,"tomato")  // throws an exception

function findInList paramList, paramItem, findLast
	set temp to every offset of paramItem within paramList
	if (number of items in temp = 0)
		Throw InvalidSearch, "Item not found in list"
	end if
	if findLast
		return last item of temp
	else
		return first item of temp
	end if
end findInList

Note: Sensetalk indexes from 1

Sidef

var haystack = %w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);

%w(Bush Washington).each { |needle|
    var i = haystack.first_index{|item| item == needle};
    if (i >= 0) {
        say "#{i} #{needle}";
    } else {
        die "#{needle} is not in haystack";
    }
}
Output:
4 Bush
Washington is not in haystack at find.sf line 9.

Extra credit:

var haystack = %w(Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo);
say haystack.last_index{|item| item == "Bush"};
Output:
7

Slate

define: #haystack -> ('Zig,Zag,Wally,Ronald,Bush,Krusty,Charlie,Bush,Bozo' splitWith: $,).
{'Washington'. 'Bush'} do: [| :needle |
  (haystack indexOf: needle)
    ifNil: [inform: word ; ' is not in the haystack']
    ifNotNilDo: [| :firstIndex lastIndex |
      inform: word ; ' is in the haystack at index ' ; firstIndex printString.
      lastIndex: (haystack lastIndexOf: word).
      lastIndex isNotNil /\ (lastIndex > firstIndex) ifTrue:
        [inform: 'last occurrence of ' ; word ; ' is at index ' ; lastIndex]]].

Smalltalk

Works with: GNU Smalltalk
Works with: Smalltalk/X

Notice: Smalltalk indexes start at 1.

| haystack |
haystack := 'Zig,Zag,Wally,Ronald,Bush,Krusty,Charlie,Bush,Bozo' subStrings: $,.
{ 'Washington' . 'Bush' } do: [:word |
  |t|
  
  ((t := haystack indexOf: word) = 0) 
          ifTrue: [ ('%1 is not in the haystack' % { word }) displayNl ]
          ifFalse: [ 
               |l|
               ('%1 is at index %2' % { word . t }) displayNl.
               l := ( (haystack size) - (haystack reverse indexOf: word) + 1 ).
               ( t = l ) ifFalse: [ 
                   ('last occurence of %1 is at index %2' %  { word . l }) displayNl ]
               ]
].

the above example did not raise an exception; the following does (a handler has been added to proceed for more search words):

Works with: Smalltalk/X

Notice: the code below uses the ST/X embedded-expression-string extension.

| haystack |
haystack := 'Zig,Zag,Wally,Ronald,Bush,Krusty,Charlie,Bush,Bozo' subStrings: $,.
[
    { 'Washington' . 'Bush' . 'Ronald' } do: [:word |
      |firstIdx lastIdx|

      firstIdx := haystack 
                    indexOf:word 
                    ifAbsent:[ 
                        ProceedableError raiseRequestWith:word errorString:'not found'.
                        0 
                    ].
      firstIdx = 0 ifFalse:[
          (lastIdx := haystack lastIndexOf:word) = firstIdx 
              ifTrue:[  e'the first index of {word} is {firstIdx}' printCR ]
              ifFalse:[  e'the last index of {word} is {lastIdx}' printCR ]]
    ]
] on:Error do:[:ex |
    e'{ex description} exception raised for: {ex parameter}' printCR.
    'but I don''t care and proceed...' printCR.
    ex proceed.
]
Output:
not found exception raised for: Washington
but I don't care and proceed...
the last index of Bush is 8
the first index of Ronald is 4

Standard ML

fun find_index (pred, lst) = let
  fun loop (n, [])    = NONE
    | loop (n, x::xs) = if pred x then SOME n
                                  else loop (n+1, xs)
in
  loop (0, lst)
end;

val haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"];

app (fn needle =>
       case find_index (fn x => x = needle, haystack) of
            SOME i => print (Int.toString i ^ " " ^ needle ^ "\n")
          | NONE   => print (needle ^ " is not in haystack\n"))
    ["Washington", "Bush"];

Swift

Works with: Swift version 2.x+
let haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
for needle in ["Washington","Bush"] {
  if let index = haystack.indexOf(needle) {
    print("\(index) \(needle)")
  } else {
    print("\(needle) is not in haystack")
  }
}
Works with: Swift version 1.x
let haystack = ["Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"]
for needle in ["Washington","Bush"] {
    if let index = find(haystack, needle) {
        println("\(index) \(needle)")
    } else {
        println("\(needle) is not in haystack")
    }
}

The second task:

Works with: Swift version 2.x+
// the second part can be done several ways, but extending any Array of Comparable objects is the most generic approach
extension Array where Element : Comparable {
    func lastIndexMatching(needle:Element) -> Int? {
        
        for i in stride(from: count-1, through: 0, by: -1) {
            if self[i] == needle {
                return i
            }
        }
        return nil
    }
}

for needle in ["Washington","Bush"] {
    if let index = haystack.lastIndexMatching(needle) {
        print("\(index) \(needle)")
    } else {
        print("\(needle) is not in haystack")
    }
}

Tcl

set haystack {Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo}
foreach needle {Bush Washington} {
    if {[set idx [lsearch -exact $haystack $needle]] == -1} {
        error "$needle does not appear in the haystack"
    } else {
        puts "$needle appears at index $idx in the haystack"
    }
}

Extra credit:

set haystack {Zig Zag Wally Ronald Bush Krusty Charlie Bush Bozo}
foreach needle {Bush Washington} {
    set indices [lsearch -all -exact $haystack $needle]
    if {[llength $indices] == 0} {
        error "$needle does not appear in the haystack"
    } else {
        puts "$needle appears first at index [lindex $indices 0] and last at [lindex $indices end]" 
    }
}

TorqueScript

--Elm 03:38, 18 June 2012 (UTC)

Find multiple needles in a haystack:

function findIn(%haystack,%needles)
{	
	%hc = getWordCount(%haystack);
	%nc = getWordCount(%needles);
	
	for(%i=0;%i<%nc;%i++)
	{
		%nword = getWord(%needles,%i);
		%index[%nword] = -1;
	}
	
	for(%i=0;%i<%hc;%i++)
	{
		%hword = getWord(%haystack,%i);
		
		for(%j=0;%j<%nc;%j++)
		{
			%nword = getWord(%needles,%j);
			
			if(%hword $= %nword)
			{
				%index[%nword] = %i;
			}
		}
	}
	
	for(%i=0;%i<%nc;%i++)
	{
		%nword = getWord(%needles,%i);
		%string = %string SPC %nword@"_"@%index[%nword];
		%string = trim(%string);
	}	
	
	return %string;
}

How to use it:

echo(findIn("Hello world, you are quite sunny today.","quite hello somethingelse"));

returns:

=> "quite_4 hello_0 somethingelse_-1"

TUSCRIPT

$$ MODE TUSCRIPT
SET haystack="Zig'Zag'Wally'Ronald'Bush'Krusty'Charlie'Bush'Bozo"
PRINT "haystack=",haystack
LOOP needle="Washington'Bush'Wally"
SET table  =QUOTES (needle)
BUILD S_TABLE needle = table
 IF (haystack.ct.needle) THEN
  BUILD R_TABLE needle = table
  SET position=FILTER_INDEX(haystack,needle,-)
  RELEASE R_TABLE needle
  PRINT "haystack contains ", needle, " on position(s): ",position
 ELSE
  PRINT "haystack not contains ",needle
 ENDIF
RELEASE S_TABLE needle
ENDLOOP
Output:
haystack=Zig'Zag'Wally'Ronald'Bush'Krusty'Charlie'Bush'Bozo
haystack not contains Washington
haystack contains Bush on position(s): 5'8
haystack contains Wally on position(s): 3 

UNIX Shell

Works with: Almquist Shell
Works with: bash
Works with: ksh93
Works with: pdksh
Works with: Z Shell
if [ $1 ];then
haystack="Zip Zag Wally Ronald Bush Krusty Charlie Bush Bozo"

index=$(echo $haystack|tr " " "\n"|grep -in "^$1$")
if [ $? = 0 ];then
quantity_of_hits=$(echo $index|tr " " "\n"|wc -l|tr -d " ")
first_index=$(echo $index|cut -f 1 -d ":")
if [ $quantity_of_hits = 1 ];then
echo The sole index for $1 is: $first_index
else
echo The smallest index for $1 is: $first_index
greatest_index=$(echo $index|tr " " "\n"|tail -1|cut -f 1 -d ":")
echo "The greatest index for $1 is: $greatest_index";fi
else echo $1 is absent from haystatck.;fi
else echo Must provide string to find in haystack.;fi
Output:
./needle_haystack clay     ---> clay is absent from haystatck.
./needle_haystack charlie  ---> The sole index for charlie is: 7
./needle_haystack bush     ---> The smallest index for bush is: 5
                                The greatest index for bush is: 8

Ursala

The indices function takes a pair of any type, treats haystack as a list, and returns the pair of indices giving the first and last positions of needle in it, which are numbered from zero and may be equal. If it's not present, an exception is thrown with a diagnostic message of 'missing'. The search is expressed by ~|, the built-in distributing filter operator.

#import std

indices = ||<'missing'>!% ~&nSihzXB+ ~&lrmPE~|^|/~& num

The explanation is somewhat longer than the program.

  • The ^| operator takes a right operand consisting of a pair of functions , and returns a function that takes a pair to the result .
  • An expression of the form h/f g where h is a function taking a pair, is equivalent to h(f,g).
  • The ~& operator represents the identity function.
  • The expression ^|/~& num applied to an argument therefore evaluates to num
  • The num function takes any list and transforms it to a list of pairs .
  • The left operand to the ^| operator, if any, is composed with the function constructed from the right. In this case, the left operand is ~&lrmPE~|
  • The ~| operator takes a predicate as its left operand and returns a function that operates on a pair , where is expected to be a list. The resulting function is evaluated by pairing with each item of , applying the predicate to each pair, and making a list of the items of for which the predicate holds on the pair.
  • The predicate in this case is ~&lrmPE, which will be passed an input of the form for the -th item in terms of the notation above.
  • The expression ~&lrmPE has a root operator E, which tests for equality, a left operand l, which extracts the left side of its argument, and a right operand of rmP, which is the reverse composition (P) of the right side extraction (r) operator, followed by a further right side extraction expressed more idiomatically as m when the argument in question represents some type of key-value pair.
  • The predicate therefore compares the left side of , which is , to the right of the right, which is
  • The result from ~&lrmPE~| will be a list of pairs of the form , for indices at which appears in the list.
  • This result is passed to the function ~&nSihzXB, which consists of subexpressions nS and ihzXB that operate sequentially.
  • The nS subexpression makes a list of the left sides of all items of a list of key-value pairs, in this case constructing a list of indices from the input, and passing it to the subexpression ihzXB.
  • The subexpression ihzXB has a left subexpression i, a right subexpression hzX and a root B.
  • The B (mnemonic for "both") operator causes the left subexpression to be applied to the argument as a test, and if the result is non-empty, returns the result of applying the right.
  • The left subexpression i represents the identity function, and tests whether the argument list is non-empty.
  • If the list is non-empty, the expression hzX constructs the pair (X) of the head (h) and the last item (z) of the list given in the argument.
  • The disjunction operator || used in an expression of the form ||u v with functions u and v constructs a function that applies v to the argument, returns that result if non-empty, but otherwise returns the the result of applying v to the argument.
  • The expression <'missing'> is a list of strings representing the diagnostic message to be returned in the event of an empty list (corresponding to the not being present).
  • The constant operator (!) is used because the message is not data-dependent.
  • The exception throwing operator (%) compels the result of its operand to be returned in a way that bypasses the usual flow of control.

Test program:

#cast %nW

test = indices/'bar' <'foo','bar','baz','bar'>
Output:
(1,3)

VBA

Function IsInArray(stringToBeFound As Variant, arr As Variant, _
    Optional start As Integer = 1, Optional reverse As Boolean = False) As Long
'Adapted from https://stackoverflow.com/questions/12414168/use-of-custom-data-types-in-vba
    Dim i As Long, lo As Long, hi As Long, stp As Long
    ' default return value if value not found in array
    IsInArray = -1
    If reverse Then
        lo = UBound(arr): hi = start: stp = -1
    Else
        lo = start: hi = UBound(arr): stp = 1
    End If
    For i = lo To hi Step stp 'start in stead of LBound(arr)
        If StrComp(stringToBeFound, arr(i), vbTextCompare) = 0 Then
            IsInArray = i
            Exit For
        End If
    Next i
End Function
Public Sub search_a_list()
    Dim haystack() As Variant, needles() As Variant
    haystack = [{"Zig","Zag","Wally","Ronald","Bush","Krusty","Charlie","Bush","Bozo"}]
    needles = [{"Washington","Bush"}]
    For i = 1 To 2
        If IsInArray(needles(i), haystack) = -1 Then
            Debug.Print needles(i); " not found in haystack."
        Else
            Debug.Print needles(i); " is at position "; CStr(IsInArray(needles(i), haystack)); ".";
            Debug.Print " And last position is ";
            Debug.Print CStr(IsInArray(needles(i), haystack, 1, True)); "."
        End If
    Next i
End Sub
Output:
Washington not found in haystack.
Bush is at position 5. And last position is 8.

VBScript

Shamelessly derived from the BASIC version.

data = "foo,bar,baz,quux,quuux,quuuux,bazola,ztesch,foo,bar,thud,grunt," &_
		"foo,bar,bletch,foo,bar,fum,fred,jim,sheila,barney,flarp,zxc," &_
		"spqr,wombat,shme,foo,bar,baz,bongo,spam,eggs,snork,foo,bar," &_
		"zot,blarg,wibble,toto,titi,tata,tutu,pippo,pluto,paperino,aap," &_
		"noot,mies,oogle,foogle,boogle,zork,gork,bork"
       
haystack = Split(data,",")

Do
	WScript.StdOut.Write "Word to search for? (Leave blank to exit) "
	needle = WScript.StdIn.ReadLine
	If needle <> "" Then
		found = 0
		For i = 0 To UBound(haystack)
			If UCase(haystack(i)) = UCase(needle) Then
				found = 1
				WScript.StdOut.Write "Found " & Chr(34) & needle & Chr(34) & " at index " & i
				WScript.StdOut.WriteLine
			End If
		Next
		If found < 1 Then
			WScript.StdOut.Write Chr(34) & needle & Chr(34) & " not found."
			WScript.StdOut.WriteLine
		End If
	Else
		Exit do
	End If
Loop
Output:
F:\VBScript>cscript /nologo search_a_list.vbs
Word to search for? (Leave blank to exit) foo
Found "foo" at index 0
Found "foo" at index 8
Found "foo" at index 12
Found "foo" at index 15
Found "foo" at index 27
Found "foo" at index 34
Word to search for? (Leave blank to exit) bar
Found "bar" at index 1
Found "bar" at index 9
Found "bar" at index 13
Found "bar" at index 16
Found "bar" at index 28
Found "bar" at index 35
Word to search for? (Leave blank to exit) fff
"fff" not found.
Word to search for? (Leave blank to exit)

F:\VBScript>

Wart

Wart uses the function pos to search a list for an element. Here's how it's implemented:

def (pos x (seq | (head ... tail)) n)
  default n :to 0
  if seq
    if (head = x)
      n
      (pos x tail n+1)
Usage:
pos 3 '(1 2 3 4 5)
=> 2
pos 24 '(1 2 3 4 5)
=> nil

Wren

Library: Wren-seq
import "/seq" for Lst

var find = Fn.new { |haystack, needle|
    var res = Lst.indicesOf(haystack, needle)
    if (!res[0]) Fiber.abort("Needle not found in haystack.")
    System.print("The needle occurs %(res[1]) time(s) in the haystack.")
    if (res[1] == 1) {
        System.print("It occurs at index %(res[2][0])")
    } else {
        System.print("It first occurs at index %(res[2][0])")
        System.print("It last  occurs at index %(res[2][-1])")
    }
    System.print()
}

var haystack = ["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Boz", "Zag"]
System.print("The haystack is:\n%(haystack)\n")
var needles = ["Wally", "Bush", "Zag", "George"]
for (needle in needles) {
    System.print("The needle is %(needle).")
    find.call(haystack, needle)
}
Output:
The haystack is:
[Zig, Zag, Wally, Ronald, Bush, Krusty, Charlie, Bush, Boz, Zag]

The needle is Wally.
The needle occurs 1 time(s) in the haystack.
It occurs at index 2

The needle is Bush.
The needle occurs 2 time(s) in the haystack.
It first occurs at index 4
It last  occurs at index 7

The needle is Zag.
The needle occurs 2 time(s) in the haystack.
It first occurs at index 1
It last  occurs at index 9

The needle is George.
Needle not found in haystack.
[./search_list line 5] in new(_) block argument
[./search_list line 21] in (script)

XPL0

\Based on C example:
include c:\cxpl\stdlib;     \provides StrCmp routine, etc.
int Haystack;               \('int' is used instead of 'char' for 2D array)
 
func Search(Str, First);    \Return first (or last) index for string in haystack
char Str; int First;
int I, SI;
[I:= 0;  SI:= 0;
repeat  if StrCmp(Str, Haystack(I)) = 0 then
                [if First then return I;
                SI:= I;     \save index
                ];
        I:= I+1;
until   Haystack(I) = 0;
return SI;
];

[Haystack:= ["Zig", "Zag", "Wally", "Ronald", "Bush",
             "Krusty", "Charlie", "Bush", "Boz", "Zag", 0];
Text(0, "Bush is at ");  IntOut(0, Search("Bush", true));  CrLf(0);
if Search("Washington", true) = 0 then
        Text(0, "Washington is not in the haystack^M^J");
Text(0, "First index for Zag: ");  IntOut(0, Search("Zag", true));  CrLf(0);
Text(0,  "Last index for Zag: ");  IntOut(0, Search("Zag", false)); CrLf(0);
]
Output:
Bush is at 4
Washington is not in the haystack
First index for Zag: 1
Last index for Zag: 9

Yabasic

list$ = "mouse,hat,cup,deodorant,television,soap,methamphetamine,severed cat heads,cup"

dim item$(1)

n = token(list$, item$(), ",")

line input "Enter string to search: " line$
for i = 1 to n
    if line$ = item$(i) then
        if not t print "First index for ", line$, ": ", i
        t = i
        j = j + 1
    end if
next

if t = 0 then
    print "String not found in list"
else
    if j > 1 print "Last index for ", line$, ": ", t
end if

Yorick

haystack = ["Zig", "Zag", "Wally", "Ronald", "Bush", "Krusty", "Charlie", "Bush", "Bozo"];
needles = ["Bush", "Washington"];
for(i = 1; i <= numberof(needles); i++) {
    w = where(haystack == needles(i));
    if(!numberof(w))
        error, "Needle "+needles(i)+" not found";
    write, format="Needle %s appears first at index %d\n", needles(i), w(1);
    if(numberof(w) > 1)
        write, format="Needle %s appears last at index %d\n", needles(i), w(0);
}

zkl

L("Krusty","Charlie","Bozo","Bozo").index("Charlie") //--> 1
L("Krusty","Charlie","Bozo","Bozo").index("fred") //--> throws index error

Find last needle:

haystack:=L("Krusty","Charlie","Bozo","Bozo");
haystack.filterNs('==("Bozo"))[-1];  // -->3, indexError if not found
haystack.len() - 1 - haystack.reverse().index("Bozo");  // or this

Use a bit bucket of ASCIIZ strings

haystack:=Data(0,String,"Krusty","Charlie","Bozo","Bozo");
if((n:=haystack.findString("Charlie")) != Void) n else throw(Exception.IndexError);
//-->7