मेरे पास String[]
मूल्यों के साथ ऐसा है:
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
यह देखते हुए String s
कि क्या VALUES
इसमें परीक्षण का एक अच्छा तरीका है s
?
मेरे पास String[]
मूल्यों के साथ ऐसा है:
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
यह देखते हुए String s
कि क्या VALUES
इसमें परीक्षण का एक अच्छा तरीका है s
?
जवाबों:
Arrays.asList(yourArray).contains(yourValue)
चेतावनी: यह प्राथमिकताओं के सरणियों के लिए काम नहीं करता है (टिप्पणियों को देखें)।
String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);
जानने के लिए कि की एक सरणी int
, double
या long
एक मूल्य उपयोग किया गया है IntStream
, DoubleStream
या LongStream
क्रमशः।
int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);
ArrayList
, लेकिन java.util.ArrayList
जैसा कि आप उम्मीद नहीं करते हैं, असली वर्ग वापस आ गया है: के java.util.Arrays.ArrayList<E>
रूप में परिभाषित किया गया है public class java.util.Arrays {private static class ArrayList<E> ... {}}
:।
संदर्भ सरणियाँ खराब हैं। इस मामले के लिए हम एक सेट के बाद हैं। जावा एसई 9 के बाद से हमारे पास है Set.of
।
private static final Set<String> VALUES = Set.of(
"AB","BC","CD","AE"
);
"स्ट्रिंग स्टिंग को देखते हुए, क्या परीक्षण का एक अच्छा तरीका है कि क्या वैल्यू में एस शामिल हैं?"
VALUES.contains(s)
हे (1)।
सही प्रकार , अपरिवर्तनीय , हे (1) और संक्षिप्त । सुंदर।*
बस शुरू करने के लिए कोड को साफ़ करने के लिए। हमने (सुधारा):
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
यह एक उत्परिवर्ती स्थैतिक है जो फाइंडबग्स आपको बताएगा कि आप बहुत शरारती हैं। स्टैटिक्स को संशोधित न करें और अन्य कोड को भी ऐसा करने की अनुमति न दें। पूर्ण न्यूनतम पर, क्षेत्र निजी होना चाहिए:
private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
(ध्यान दें, आप वास्तव में new String[];
बिट ड्रॉप कर सकते हैं ।)
संदर्भ सरणियाँ अभी भी खराब हैं और हम एक सेट चाहते हैं:
private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
new String[] {"AB","BC","CD","AE"}
));
(स्वयं के रूप में पागल लोग, यदि यह लिपटे हुए हों, तो यह और भी अधिक आसान लग सकता है Collections.unmodifiableSet
- फिर इसे सार्वजनिक भी किया जा सकता है।)
(* ब्रांड पर थोड़ा और अधिक होने के लिए, संग्रह एपीआई अभी भी अपरिवर्तनीय संग्रह प्रकारों को याद कर रहा है और मेरे स्वाद के लिए वाक्य रचना अभी भी बहुत अधिक क्रियात्मक है।)
Arrays.asList
)?
TreeSet
होगा O(log n)
। HashSet
s को ऐसे स्केल किया गया है कि बाल्टी में तत्वों की औसत संख्या लगभग स्थिर है। कम से कम 2 ^ 30 तक सरणियों के लिए। कहते हैं, हार्डवेयर कैश से प्रभावित हो सकता है जो बड़े-ओ विश्लेषण की उपेक्षा करता है। यह भी मानता है कि हैश फ़ंक्शन प्रभावी रूप से काम कर रहा है।
आप अपाचे कॉमन्स लैंगArrayUtils.contains
से उपयोग कर सकते हैं
public static boolean contains(Object[] array, Object objectToFind)
ध्यान दें कि false
यदि पारित सरणी है तो यह विधि वापस आती है null
।
सभी प्रकार की आदिम सरणियों के लिए भी विधियाँ उपलब्ध हैं।
String[] fieldsToInclude = { "id", "name", "location" };
if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
// Do some stuff.
}
बस इसे हाथ से लागू करें:
public static <T> boolean contains(final T[] array, final T v) {
for (final T e : array)
if (e == v || v != null && v.equals(e))
return true;
return false;
}
सुधार की:
v != null
हालत विधि अंदर निरंतर है। यह हमेशा विधि कॉल के दौरान उसी बूलियन मान का मूल्यांकन करता है। इसलिए यदि इनपुट array
बड़ा है, तो केवल एक बार इस स्थिति का मूल्यांकन करना अधिक कुशल है, और हम for
परिणाम के आधार पर लूप के अंदर एक सरलीकृत / तेज स्थिति का उपयोग कर सकते हैं । बेहतर contains()
तरीका:
public static <T> boolean contains2(final T[] array, final T v) {
if (v == null) {
for (final T e : array)
if (e == null)
return true;
}
else {
for (final T e : array)
if (e == v || v.equals(e))
return true;
}
return false;
}
Collection.contains(Object)
Arrays
और ArrayList
यह पता चला है कि यह आवश्यक रूप से उपयोग किए जाने वाले संस्करण की तुलना में तेज़ नहीं है Arrays.asList(...).contains(...)
। एक बनाने का ओवरहेड एक ArrayList
बहुत छोटा है, और ArrayList.contains()
ऊपर दिखाए गए (जेडीके 7) की तुलना में एक स्मार्ट लूप (वास्तव में यह दो अलग-अलग छोरों का उपयोग करता है) का उपयोग करता है।
चार अलग-अलग तरीकों की जाँच करें कि क्या एक सरणी में एक मान होता है
1) सूची का उपयोग करना:
public static boolean useList(String[] arr, String targetValue) {
return Arrays.asList(arr).contains(targetValue);
}
2) सेट का उपयोग:
public static boolean useSet(String[] arr, String targetValue) {
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);
}
3) एक साधारण लूप का उपयोग करना:
public static boolean useLoop(String[] arr, String targetValue) {
for (String s: arr) {
if (s.equals(targetValue))
return true;
}
return false;
}
4) Arrays.binarySearch () का उपयोग करना:
नीचे दिया गया कोड गलत है, इसे पूर्णता के लिए यहां सूचीबद्ध किया गया है। बाइनरीसर्च () केवल सॉर्ट किए गए सरणियों पर उपयोग किया जा सकता है। आप पाएंगे कि परिणाम नीचे अजीब है। यह सबसे अच्छा विकल्प है जब सरणी को सॉर्ट किया जाता है।
public static boolean binarySearch(String[] arr, String targetValue) {
int a = Arrays.binarySearch(arr, targetValue);
return a > 0;
}
String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false
यदि सरणी को क्रमबद्ध नहीं किया गया है, तो आपको हर चीज पर पुनरावृत्त करना होगा और प्रत्येक पर एक समान कॉल करना होगा।
यदि सरणी को क्रमबद्ध किया जाता है, तो आप बाइनरी खोज कर सकते हैं, एरेस वर्ग में एक है ।
सामान्यतया, यदि आप बहुत अधिक सदस्यता जाँच करने जा रहे हैं, तो आप एक सेट में सब कुछ स्टोर करना चाहते हैं, न कि किसी सरणी में।
इसके लायक मैं गति के लिए 3 सुझावों की तुलना में एक परीक्षण भागा। मैंने यादृच्छिक पूर्णांक उत्पन्न किए, उन्हें स्ट्रिंग में परिवर्तित किया और उन्हें एक सरणी में जोड़ा। मैंने तब उच्चतम संभव संख्या / स्ट्रिंग की खोज की, जो इसके लिए सबसे खराब स्थिति होगी asList().contains()
।
10K सरणी आकार का उपयोग करते समय परिणाम थे:
क्रमबद्ध करें और खोजें: 15 बाइनरी खोज: 0 asList.contains: 0
100K सरणी का उपयोग करते समय परिणाम थे:
क्रमबद्ध करें और खोजें: 156 बाइनरी खोज: 0 asList.contains: 32
तो अगर सरणी को क्रमबद्ध क्रम में बनाया गया है तो द्विआधारी खोज सबसे तेज़ है, अन्यथा asList().contains
जाने का रास्ता होगा। यदि आपके पास कई खोज हैं, तो यह सरणी को क्रमबद्ध करने के लिए सार्थक हो सकता है ताकि आप द्विआधारी खोज का उपयोग कर सकें। यह सब आपके आवेदन पर निर्भर करता है।
मुझे लगता है कि वे परिणाम हैं जो ज्यादातर लोग उम्मीद करेंगे। यहाँ परीक्षण कोड है:
import java.util.*;
public class Test
{
public static void main(String args[])
{
long start = 0;
int size = 100000;
String[] strings = new String[size];
Random random = new Random();
for (int i = 0; i < size; i++)
strings[i] = "" + random.nextInt( size );
start = System.currentTimeMillis();
Arrays.sort(strings);
System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
System.out.println("Sort & Search : " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
System.out.println("Search : " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
System.out.println(Arrays.asList(strings).contains( "" + (size - 1) ));
System.out.println("Contains : " + (System.currentTimeMillis() - start));
}
}
त्वरित सरणी आरंभीकरण सिंटैक्स का भी उपयोग करने के बजाय, आप इसे Arrays.asList पद्धति, जैसे:
public static final List<String> STRINGS = Arrays.asList("firstString", "secondString" ...., "lastString");
तब आप कर सकते हैं (ऊपर की तरह):
STRINGS.contains("the string you want to find");
Java 8 के साथ आप एक स्ट्रीम बना सकते हैं और चेक कर सकते हैं कि स्ट्रीम में कोई एंट्री मेल खाती है या नहीं "s"
:
String[] values = {"AB","BC","CD","AE"};
boolean sInArray = Arrays.stream(values).anyMatch("s"::equals);
या एक सामान्य विधि के रूप में:
public static <T> boolean arrayContains(T[] array, T value) {
return Arrays.stream(array).anyMatch(value::equals);
}
anyMatch
जावाडॉक कहता है कि यह "...May not evaluate the predicate on all elements if not necessary for determining the result."
, इसलिए उसे एक मैच खोजने के बाद प्रसंस्करण जारी रखने की आवश्यकता नहीं हो सकती है।
मान के लिए बाइनरी खोज करने के लिए आप Arrays वर्ग का उपयोग कर सकते हैं । यदि आपकी सरणी सॉर्ट नहीं की गई है, तो आपको सरणी को सॉर्ट करने के लिए उसी वर्ग में सॉर्ट फ़ंक्शंस का उपयोग करना होगा, फिर इसके माध्यम से खोजें।
ObStupidAnswer (लेकिन मुझे लगता है कि इसमें कहीं न कहीं एक सबक है):
enum Values {
AB, BC, CD, AE
}
try {
Values.valueOf(s);
return true;
} catch (IllegalArgumentException exc) {
return false;
}
वास्तव में, यदि आप टॉम के बारे में हैशसेट <स्ट्रिंग> का उपयोग करते हैं, तो प्रस्तावित किया गया है कि आपको छंटाई के बारे में चिंता करने की आवश्यकता नहीं है, और आपकी गति एक समान सरणी पर बाइनरी खोज के साथ भी संभव है।
यह सब इस बात पर निर्भर करता है कि आपका कोड कैसे सेट किया गया है, जाहिर है, लेकिन जहां से मैं खड़ा हूं, वह क्रम होगा:
एक अनसुलझी सरणी पर:
एक क्रमबद्ध सरणी पर:
तो या तो, जीत के लिए हैशसेट।
यदि आपके पास Google संग्रह लाइब्रेरी है, तो ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/IntutableSet.html) का उपयोग करके टॉम के उत्तर को बहुत सरल बनाया जा सकता है
यह वास्तव में प्रस्तावित इनिशियलाइज़ेशन से बहुत अधिक अव्यवस्था को हटाता है
private static final Set<String> VALUES = ImmutableSet.of("AB","BC","CD","AE");
एक संभव समाधान:
import java.util.Arrays;
import java.util.List;
public class ArrayContainsElement {
public static final List<String> VALUES = Arrays.asList("AB", "BC", "CD", "AE");
public static void main(String args[]) {
if (VALUES.contains("AB")) {
System.out.println("Contains");
} else {
System.out.println("Not contains");
}
}
}
डेवलपर्स अक्सर करते हैं:
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);
उपरोक्त कोड काम करता है, लेकिन पहले सेट करने के लिए एक सूची को बदलने की आवश्यकता नहीं है। सूची को सेट पर बदलने के लिए अतिरिक्त समय की आवश्यकता होती है। यह सरल हो सकता है:
Arrays.asList(arr).contains(targetValue);
या
for(String s: arr){
if(s.equals(targetValue))
return true;
}
return false;
पहला वाला दूसरे की तुलना में अधिक पठनीय है।
एक सरल लूप का उपयोग करना ऐसा करने का सबसे कुशल तरीका है।
boolean useLoop(String[] arr, String targetValue) {
for(String s: arr){
if(s.equals(targetValue))
return true;
}
return false;
}
सौजन्य से प्रोग्रामक्रिक
में जावा 8 स्ट्रीम का उपयोग करें।
List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
सीमित लंबाई के सरणियों के लिए निम्नलिखित का उपयोग करें (जैसा कि कैमिक्र द्वारा दिया गया है )। यह बार-बार होने वाली जाँचों के लिए धीमा है, विशेष रूप से लंबी सरणियों (रैखिक खोज) के लिए।
Arrays.asList(...).contains(...)
तेज प्रदर्शन के लिए यदि आप बार-बार तत्वों के एक बड़े समूह के खिलाफ जांच करते हैं
एक सरणी गलत संरचना है। एक का उपयोग करें TreeSet
और इसमें प्रत्येक तत्व जोड़ें। यह तत्वों को क्रमबद्ध करता है और इसकी एक तेज़ exist()
विधि (बाइनरी खोज) होती है।
यदि तत्व लागू होते हैं Comparable
और आप उसके TreeSet
अनुसार क्रमबद्ध करना चाहते हैं :
ElementClass.compareTo()
विधि के साथ अनुकूल होना चाहिए ElementClass.equals()
: देखें कि त्रय युद्ध करने के लिए दिखाई नहीं दे रहे हैं? (जावा सेट एक आइटम गायब है)
TreeSet myElements = new TreeSet();
// Do this for each element (implementing *Comparable*)
myElements.add(nextElement);
// *Alternatively*, if an array is forceably provided from other code:
myElements.addAll(Arrays.asList(myArray));
अन्यथा, अपना खुद का उपयोग करें Comparator
:
class MyComparator implements Comparator<ElementClass> {
int compareTo(ElementClass element1; ElementClass element2) {
// Your comparison of elements
// Should be consistent with object equality
}
boolean equals(Object otherComparator) {
// Your equality of comparators
}
}
// construct TreeSet with the comparator
TreeSet myElements = new TreeSet(new MyComparator());
// Do this for each element (implementing *Comparable*)
myElements.add(nextElement);
अदायगी: कुछ तत्व के अस्तित्व की जाँच करें:
// Fast binary search through sorted elements (performance ~ log(size)):
boolean containsElement = myElements.exists(someElement);
TreeSet
? HashSet
तेज़ है (O (1)) और ऑर्डर करने की आवश्यकता नहीं है।
इसे इस्तेमाल करे:
ArrayList<Integer> arrlist = new ArrayList<Integer>(8);
// use add() method to add elements in the list
arrlist.add(20);
arrlist.add(25);
arrlist.add(10);
arrlist.add(15);
boolean retval = arrlist.contains(10);
if (retval == true) {
System.out.println("10 is contained in the list");
}
else {
System.out.println("10 is not contained in the list");
}
निम्नलिखित का उपयोग करें ( contains()
विधि ArrayUtils.in()
इस कोड में है):
ObjectUtils.java
public class ObjectUtils{
/**
* A null safe method to detect if two objects are equal.
* @param object1
* @param object2
* @return true if either both objects are null, or equal, else returns false.
*/
public static boolean equals(Object object1, Object object2){
return object1==null ? object2==null : object1.equals(object2);
}
}
ArrayUtils.java
public class ArrayUtils{
/**
* Find the index of of an object is in given array, starting from given inclusive index.
* @param ts Array to be searched in.
* @param t Object to be searched.
* @param start The index from where the search must start.
* @return Index of the given object in the array if it is there, else -1.
*/
public static <T> int indexOf(final T[] ts, final T t, int start){
for(int i = start; i < ts.length; ++i)
if(ObjectUtils.equals(ts[i], t))
return i;
return -1;
}
/**
* Find the index of of an object is in given array, starting from 0;
* @param ts Array to be searched in.
* @param t Object to be searched.
* @return indexOf(ts, t, 0)
*/
public static <T> int indexOf(final T[] ts, final T t){
return indexOf(ts, t, 0);
}
/**
* Detect if the given object is in the given array.
* @param ts Array to be searched in.
* @param t Object to be searched.
* @return If indexOf(ts, t) is greater than -1.
*/
public static <T> boolean in(final T[] ts, final T t){
return indexOf(ts, t) > -1 ;
}
}
जैसा कि आप ऊपर दिए गए कोड में देख सकते हैं, कि अन्य उपयोगिता विधियां हैं ObjectUtils.equals()
और ArrayUtils.indexOf()
, जिनका उपयोग अन्य स्थानों पर भी किया गया था।
इसे देखो
String[] VALUES = new String[] {"AB","BC","CD","AE"};
String s;
for(int i=0; i< VALUES.length ; i++)
{
if ( VALUES[i].equals(s) )
{
// do your stuff
}
else{
//do your stuff
}
}
else
लिए दर्ज होगा जो मेल नहीं खाता है (इसलिए यदि आप उस सरणी में "एबी" की तलाश कर रहे हैं, तो यह 3 बार वहां जाएगा, क्योंकि मानों में से 3 "एबी" नहीं हैं। ")।
Arrays.asList () -> तब इसमें कॉलिंग () विधि हमेशा काम करेगी, लेकिन एक खोज एल्गोरिथ्म बहुत बेहतर है क्योंकि आपको सरणी के चारों ओर एक हल्के सूची आवरण बनाने की आवश्यकता नहीं है, जो कि Arrays.asList () करता है। ।
public boolean findString(String[] strings, String desired){
for (String str : strings){
if (desired.equals(str)) {
return true;
}
}
return false; //if we get here… there is no desired String, return false.
}
Arrays.asList
O (n) नहीं है। यह सिर्फ एक हल्का आवरण है। कार्यान्वयन पर एक नजर है।
यदि आप इसे संवेदनशील नहीं बनाना चाहते हैं
Arrays.stream(VALUES).anyMatch(s::equalsIgnoreCase);
उपयोग Array.BinarySearch(array,obj)
दिए गए ऑब्जेक्ट को सरणी में या नहीं खोजने के लिए ।
उदाहरण:
if (Array.BinarySearch(str, i) > -1)` → true --exists
असत्य नहीं है
Array.BinarySearch
और Array.FindIndex
.NET विधियाँ हैं और जावा में मौजूद नहीं हैं।
The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
जावा 8 विधेय परीक्षण विधि का उपयोग करने का प्रयास करें
इसका पूरा उदाहरण यहां दिया जा रहा है।
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Test {
public static final List<String> VALUES = Arrays.asList("AA", "AB", "BC", "CD", "AE");
public static void main(String args[]) {
Predicate<String> containsLetterA = VALUES -> VALUES.contains("AB");
for (String i : VALUES) {
System.out.println(containsLetterA.test(i));
}
}
}
http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html
https://github.com/VipulGulhane1/java8/blob/master/Test.java
का उपयोग Spliterator
अनावश्यक पीढ़ी को रोकता है List
boolean found = false; // class variable
String search = "AB";
Spliterator<String> spl = Arrays.spliterator( VALUES, 0, VALUES.length );
while( (! found) && spl.tryAdvance(o -> found = o.equals( search )) );
found == true
अगर search
सरणी में समाहित है
यह आदिम के सरणियों के लिए काम करता है
public static final int[] VALUES = new int[] {1, 2, 3, 4};
boolean found = false; // class variable
int search = 2;
Spliterator<Integer> spl = Arrays.spliterator( VALUES, 0, VALUES.length );
…
जैसा कि मैंने आदिम प्रकार बाइट और बाइट [] का उपयोग कर निम्न स्तर जावा के साथ काम कर रहा हूँ, सबसे अच्छा अब तक मुझे मिल से है बाइट्स-जावा https://github.com/patrickfav/bytes-java काम का जुर्माना टुकड़ा लगता है
आप इसे दो तरीकों से जांच सकते हैं
ए) सरणी को स्ट्रिंग में परिवर्तित करके और फिर आवश्यक स्ट्रिंग को .contains विधि द्वारा जांचें
String a=Arrays.toString(VALUES);
System.out.println(a.contains("AB"));
System.out.println(a.contains("BC"));
System.out.println(a.contains("CD"));
System.out.println(a.contains("AE"));
बी) यह एक अधिक प्रभावी विधि है
Scanner s=new Scanner(System.in);
String u=s.next();
boolean d=true;
for(int i=0;i<VAL.length;i++)
{
if(VAL[i].equals(u)==d)
System.out.println(VAL[i] +" "+u+VAL[i].equals(u));
}