අරාවෙහි ජාවා හි විශේෂිත අගයක් තිබේද යන්න තීරණය කරන්නේ කෙසේද?


2284

මට එවැනි String[]අගයන් ඇත:

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

ලබා දී String s, එහි යන්න පරීක්ෂා කිරීමේ හොඳ ක්රමයකි VALUESඅඩංගු s?


5
එය වටා බොහෝ දුරක් යන්න, නමුත් ඔබට a සඳහා ලූපයක් භාවිතා කළ හැකිය: "සඳහා (String s: VALUES) (s.equals (" MYVALUE ")) සත්‍ය ලෙස නැවත පැමිණේ නම්:
Zack

70
am කැමරික්. ඔබේ ප්‍රශ්නයට, මම මෙම ප්‍රශ්නය සහ ඔබේ පිළිතුර - දැන්- එය මට විනාඩි 30 ක් සහ කේත ලිවීමේ පේළි 20 ක් ලූප සඳහා කැත ලෙස ඉතිරි කළ නිසා, -නො-. අවුරුදු තුනකට පෙර එය කියවා නැත. (BTW, ස්තූතියි :))
Pursuit

3
@ camickr - මට මේ හා සමාන තත්වයක් තිබේ: stackoverflow.com/a/223929/12943 එය ඡන්ද ලබා ගැනීම දිගටම කරගෙන යන නමුත් හිරුගේ ලියකියවිලි වල පිටපතක් / පේස්ට් එකක් පමණි. මම හිතන්නේ ලකුණු පදනම් වී ඇත්තේ ඔබ කොපමණ උපකාරයක් ලබා දී ඇත්ද යන්න සහ ඔබ ඒ සඳහා කොපමණ උත්සාහයක් දැරූවාද යන්න මත නොවේ - සහ බොහෝ විට ඔබ එය කොතරම් වේගයෙන් පළ කරනවාද! සමහර විට අපි ජෝන් ස්කීට්ගේ රහසට පැටලී ඇති! හොඳ පිළිතුරක්, ඔබ වෙනුවෙන් +1.
බිල් කේ

1
ඔබ Apache Commons භාවිතා කරන්නේ නම්, org.apache.commons.lang.ArrayUtils.contains () මෙය ඔබ වෙනුවෙන් කරයි.
බෝයි මහතා

34
am කැමරික් නිසා මා වැනි අය ප්‍රශ්නයක් ගූගල් කර, SO ප්‍රති result ලය මත ක්ලික් කරන්න, ඔබේ පිළිතුර බලන්න, එය පරීක්ෂා කරන්න, එය ක්‍රියාත්මක වේ, පිළිතුර ඉහළට ඔසවා තබන්න.
ඇක්විටස්

Answers:


2936
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);

89
අරා පන්තියේ සෙවුම් කාර්යයන් හා අරාව හරහා නැවත යෙදීම හා සමාන () ශ්‍රිතයක් භාවිතා කිරීම හෝ ප්‍රාථමිකයන් සඳහා == භාවිතා කිරීම පිළිබඳව මම තරමක් කුතුහලයෙන් සිටිමි.
තෝමස් ඕවන්ස්

186
AsList () හදවතේ අරාවක් ඇති අරේලිස්ට් එකක් ආපසු ලබා දෙන බැවින් ඔබට බොහෝ දේ අහිමි නොවේ. ඉදිකිරීම්කරු විසින් යොමු කිරීමක් පමණක් වෙනස් කරනු ඇති අතර එමඟින් එතරම් වැඩක් කළ නොහැක. () / IndexOf () අඩංගු වන අතර එය සමාන () භාවිතා කරයි. ප්‍රාථමිකයන් සඳහා ඔබ එය කේතනය කිරීමට වඩා හොඳ විය යුතුය. නූල් හෝ වෙනත් පන්ති සඳහා, වෙනස සැලකිය යුතු නොවේ.
ජෝයි

18
ඔඩ්, නෙට්බීන්ස් කියා සිටින්නේ, 'ඉන්ටර් [] නිවාඩු' සඳහා 'අරාස්.ලිස්ට් (නිවාඩු දින' 'මඟින්' ලැයිස්තුවක් <int []> 'ලබා දෙන අතර' ලැයිස්තුවක් <int> 'නොවේ. එහි ඇත්තේ එක් තනි අංගයකි. අඩංගු වන්නේ එහි මූලද්‍රව්‍යයක් ඇති බැවින් එය ක්‍රියා නොකරයි; int අරාව.
නයර්ගුඩ්ස්

62
නයර්ගුඩ්ස්: ඇත්ත වශයෙන්ම මෙය ප්‍රාථමිකයන් සඳහා ක්‍රියා නොකරයි. ජාවා වල ප්‍රාථමික වර්ග සාමාන්‍ය විය නොහැක. asList <T> ලැයිස්තුව <T> asList (T ...) ලෙස ප්‍රකාශයට පත් කෙරේ. ඔබ එය තුළට int [] පසු කරන විට, සම්පාදකයා T = int [] අනුමාන කරන්නේ එයට T = int අනුමාන කළ නොහැකි නිසා, ප්‍රාථමිකයන් සාමාන්‍ය විය නොහැකි බැවිනි.
CromTheDestroyer

28
Oe ජෝයි පැත්තක සටහනක්, එය ArrayList, නමුත් java.util.ArrayListඔබ අපේක්ෂා කළ පරිදි නොවේ , ආපසු පැමිණි සැබෑ පන්තිය: java.util.Arrays.ArrayList<E>අර්ථ දැක්වෙන්නේ : public class java.util.Arrays {private static class ArrayList<E> ... {}}.
TWiStErRob

363

ජාවා එස්ඊ 9 සඳහා සංක්ෂිප්ත යාවත්කාලීන කිරීම

යොමු අරා නරකයි. මෙම නඩුව සඳහා අපි කට්ටලයකට පසුව සිටිමු. ජාවා එස්ඊ 9 සිට අපට තිබේ Set.of.

private static final Set<String> VALUES = Set.of(
    "AB","BC","CD","AE"
);

"නූල් ලබා දී ඇති විට, VALUES හි s අඩංගු දැයි පරීක්ෂා කිරීමට හොඳ ක්‍රමයක් තිබේද?"

VALUES.contains(s)

ඕ (1).

මෙම අයිතිය වර්ගය , හා අණුවල පැවැත්ම , සාමාන්ය (1) හා සංක්ෂිප්ත . ලස්සනයි. *

මුල් පිළිතුරු විස්තර

ආරම්භ කිරීම සඳහා කේතය ඉවත් කිරීමට පමණි. අප සතුව (නිවැරදි කර ඇත):

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

මෙය විකෘති ස්ථිතිකයක් වන අතර එය FindBugs ඔබට ඉතා නරක යැයි කියනු ඇත. සංඛ්‍යාලේඛන වෙනස් නොකරන්න සහ වෙනත් කේත වලටද එසේ කිරීමට ඉඩ නොදෙන්න. අවම වශයෙන්, ක්ෂේත්‍රය පෞද්ගලික විය යුතුය:

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- එය ප්‍රසිද්ධියට පත් කළ හැකිය.)

(* වෙළඳ නාමය ගැන තව ටිකක් කියතොත්, එකතු කිරීමේ API අනාවැකි ලෙස තවමත් වෙනස් කළ නොහැකි එකතු කිරීමේ වර්ග නැතිවී ඇති අතර මගේ රුචි අරුචිකම් සඳහා වාක්‍ය ඛණ්ඩය තවමත් වාචික නොවේ.)


186
එකතුව මුලින්ම නිර්මාණය කිරීම ඕ (එන්) හැර :)
ඩ්‍රූ නොක්ස්

61
එය ස්ථිතික නම්, එය බොහෝ විට භාවිතා කරනු ඇත. එබැවින්, රේඛීය සෙවුම් රාශියක පිරිවැයට සාපේක්ෂව කට්ටලය ආරම්භ කිරීමට ගතවන කාලය තරමක් කුඩා වීමට හොඳ අවස්ථාවක් තිබේ.
Xr.

1
එවිට නිර්මාණය කිරීම කේත පැටවීමේ වේලාව (තාක්‍ෂණිකව O (n) නමුත් ප්‍රායෝගිකව නියත වේ) ආධිපත්‍යය දරයි.
ටොම් හෝවින් -

2
@ ටොම්හව්ටින්-ටැක්ලයින් “විශේෂයෙන් මෙහි අපට කට්ටලයක් අවශ්‍යයි” කියා ඔබ කියන්නේ ඇයි? මෙම නඩුවේ කට්ටලයක (හැෂ්සෙට්) ඇති වාසිය කුමක්ද? "විමර්ශන අරාව" නරක වන්නේ ඇයි ("යොමු අරාව" යන්නෙන් ඔබ අදහස් කරන්නේ ඇමතුමකින් ජනනය වන පරිදි අරාවෙහි පිටුබලය ඇති අරේලිස්ට් Arrays.asList)?
බැසිල් බෝර්ක්

6
mnmr A TreeSetවනු ඇත O(log n). HashSets පරිමාණය කර ඇති අතර බාල්දියක මධ්‍යන්‍ය මූලද්‍රව්‍ය ගණන දළ වශයෙන් නියත වේ. අවම වශයෙන් 2 ^ 30 දක්වා අරා සඳහා. බිග්-ඕ විශ්ලේෂණය නොසලකා හරින දෘඩාංග හැඹිලි වලින් බලපෑම් ඇති විය හැකිය. හැෂ් ශ්‍රිතය .ලදායී ලෙස ක්‍රියාත්මක වන බව උපකල්පනය කරයි.
ටොම් හෝටින් - ටැක්ලයින්

207

ඔබට Apache Commons LangArrayUtils.contains වෙතින් භාවිතා කළ හැකිය

public static boolean contains(Object[] array, Object objectToFind)

මෙම ක්‍රමය නැවත පැමිණෙන බව සලකන්න falseසම්මත කළ අරාව නම්null .

සියලු වර්ගවල ප්‍රාථමික අරා සඳහා ක්‍රම තිබේ.

උදාහරණයක්:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}

4
@ max4ever මම එකඟ වෙමි, නමුත් මෙය "ඔබේම දෑ පෙරළීම" වඩා හොඳ වන අතර අමු ජාවා ක්‍රමය කියවීමට පහසුය.
ජේසන්


38
@ max4ever සමහර විට ඔබ දැනටමත් මෙම පුස්තකාලය ඇතුළත් කර ඇත (වෙනත් හේතු නිසා) එය පරිපූර්ණ වලංගු පිළිතුරකි. මම මේ ගැන සොයමින් සිටි අතර මම දැනටමත් අපාචි කොමන්ස් ලැන්ග් මත රඳා සිටිමි. මෙම පිළිතුරට ස්තූතියි.
ගුයිසිම්

1
නැතහොත් ඔබට ක්‍රමවේදය පිටපත් කළ හැකිය (සහ අවපීඩන තිබේ නම්).
බෆලෝ

10
@ max4ever බොහෝ ඇන්ඩ්‍රොයිඩ් යෙදුම් ප්‍රොගාර්ඩ් විසින් අවම කරනු ලැබේ, ඔබේ යෙදුමට අවශ්‍ය පන්ති සහ ක්‍රියාකාරකම් පමණක් දමයි. එමඟින් ඔබේම දෑ රෝල් කිරීමට සමාන වේ, නැතහොත් අපාචේ දේවල ප්‍රභවය පිටපත් කරන්න. එම අවම කිරීම භාවිතා නොකරන ඕනෑම කෙනෙකුට 700kb හෝ 78kb ගැන පැමිණිලි කිරීමට අවශ්‍ය නැත :)
Kenyakorn Ketsombut

158

එය අතින් ක්‍රියාත්මක කරන්න:

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;
}

9
HoPhoexo මෙම විසඳුම පැහැදිලිවම වේගවත් වන්නේ පිළිගත් පිළිතුර මඟින් අරාව ලැයිස්තුවකට ඔතා, එම ලැයිස්තුවේ අඩංගු () ක්‍රමය අමතන අතර මගේ විසඳුම මූලික වශයෙන් කරන්නේ () පමණක් කරන දේ පමණි.
icza

10
LaAlastorMoody e == v විමර්ශන සමානාත්මතා පරීක්‍ෂණයක් සිදු කරන අතර එය ඉතා වේගවත් වේ. එකම වස්තුව (යොමුව අනුව) අරාවෙහි තිබේ නම්, එය වේගයෙන් සොයාගත හැකිය. එය එකම අවස්ථාව නොවේ නම්, එය තවමත් සමාන () ක්‍රමයට හිමිකම් කියන ආකාරයටම විය හැකිය, යොමු කිරීම් සමාන නොවේ නම් පරීක්ෂා කරනුයේ මෙයයි.
icza

20
මෙම ක්‍රියාව ජාවාහි කොටසක් නොවන්නේ ඇයි? ජාවා පුපුරා ගොස් ඇති බව මිනිසුන් පැවසීම පුදුමයක් නොවේ ... ඔබට අවශ්‍ය සියල්ල ලූපයක් වන විට පුස්තකාල පොකුරක් භාවිතා කරන ඉහත පිළිතුරු දෙස බලන්න. මේ දවස්වල ළමයි!
phreakhead

4
rephreakhead එය ජාවාහි කොටසකි, බලන්නCollection.contains(Object)
ස්ටීව් කුඕ

11
@icza ඔබ මූලාශ්රය දෙස බලන විට Arraysහා ArrayListඑය අවශ්යයෙන්ම භාවිතයෙන් ඉතා ඉක්මනින් අනුවාදයට වඩා නොවන බව හැරෙනවා Arrays.asList(...).contains(...). පොදු කාර්ය සඳහා නිර්මාණය ArrayListඉතා කුඩා වන අතර, ArrayList.contains()(JDK 7) ඉහත පෙන්වා ඇති එක් වඩා ක්රමවත්ව ලූප (ඇත්තෙන්ම එය වෙනස් වළළු දෙකක් භාවිතා කරයි) භාවිතා කරයි.
ඇක්සෙල්

72

අරාවෙහි වටිනාකමක් තිබේදැයි පරීක්ෂා කිරීමට විවිධ ක්‍රම හතරක්

  1. භාවිතා කිරීම List:

    public static boolean useList(String[] arr, String targetValue) {
        return Arrays.asList(arr).contains(targetValue);
    }
  2. භාවිතා කිරීම Set:

    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():

    පහත කේතය වැරදියි, එය සම්පූර්ණත්වය සඳහා මෙහි ලැයිස්තු ගත කර ඇත. binarySearch()වර්ග කළ අරා මත පමණක් භාවිතා කළ හැකිය. ප්‍රති result ලය පහතින් අමුතු බව ඔබට පෙනී යනු ඇත. අරාව වර්ග කළ විට මෙය හොඳම විකල්පයයි.

    public static boolean binarySearch(String[] arr, String targetValue) {  
        return Arrays.binarySearch(arr, targetValue) >= 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

5
ඔබේ ද්විමය සෙවුම් උදාහරණය මඟින්> 0;
විල් ෂර්වුඩ්

6
මන්ද? 0 මඟින් එය අරාවෙහි ප්‍රධාන කොටසේ ඇති බව පෙන්වන බැවින් එය> -1 නැවත ලබා දිය යුතු යැයි මම සිතමි.
mbelow

2
සමඟ ඇති පළමු ප්‍රභේදය (a >= 0)නිවැරදියි, ලියකියවිලි පරික්ෂා කරන්න , ඔවුන් පවසන්නේ "ප්‍රතිලාභ අගය> = 0 වනු ඇති බවට මෙය සහතික වන අතර යතුර සොයාගතහොත් පමණි".
යූරි එන්

ස්ට්‍රිං වෙත ක්‍රියා කරන්නේ ඇයි? ස්ථිතික බූලියන් පවතී (int [] ints, int k) {ආපසු අරාව.අස්ලිස්ට් (ints). අඩංගු වේ (k); }
විලියන්ස් මාටින්ස්

71

අරාව වර්ග කර නොමැති නම්, ඔබට සෑම දෙයක්ම නැවත කියවීමට සිදු වන අතර ඒ සෑම එකක්ම සමාන කිරීමට ඇමතුමක් ලබා ගත යුතුය.

අරාව වර්ග කර ඇත්නම්, ඔබට ද්විමය සෙවීමක් කළ හැකිය, අරා වල එකක් තිබේ පන්තියේ .

පොදුවේ ගත් කල, ඔබ සාමාජිකත්ව චෙක්පත් විශාල ප්‍රමාණයක් කිරීමට යන්නේ නම්, ඔබට අවශ්‍ය වන්නේ සෑම දෙයක්ම අර්‍ගයක නොව කට්ටලයක ගබඩා කිරීමයි.


1
එසේම, මගේ පිළිතුරේ මා කීවාක් මෙන්, ඔබ අරා පන්තිය භාවිතා කරන්නේ නම්, ඔබට අරාව වර්ග කළ හැකිය, පසුව අලුතින් වර්ග කළ අරාව මත ද්විමය සෙවීම සිදු කරන්න.
තෝමස් ඕවන්ස්

1
H තෝමස්: මම එකඟයි. නැතහොත් ඔබට සියල්ල ගසකට එකතු කළ හැකිය; එකම සංකීර්ණත්වය. එය වෙනස් නොවන්නේ නම් මම අරාව භාවිතා කරමි (සමහර විට මතක ස්ථාන ස්වල්පයක් ඉතිරි කර ගත හැක. කාලයත් සමඟ මෙය වෙනස් වුවහොත් මම කට්ටලය භාවිතා කරමි.
යූරි

50

එය වටින දේ සඳහා මම වේගය සඳහා යෝජනා 3 සංසන්දනය කරමින් පරීක්ෂණයක් පැවැත්වුවෙමි. මම අහඹු නිඛිල උත්පාදනය කර ඒවා නූල් බවට පරිවර්තනය කර ඒවා අරාවකට එකතු කළෙමි. මම පසුව හැකි උපරිම අංකය / නූලක් සෙව්වෙමි, එය නරකම අවස්ථාවකි asList().contains().

10K අරා ප්‍රමාණයක් භාවිතා කරන විට ප්‍රති results ල වූයේ:

වර්ග කිරීම සහ සෙවීම: 15
ද්විමය සෙවීම: 0
asList.contains: 0

100K අරා භාවිතා කරන විට ප්‍රති results ල වූයේ:

වර්ග කිරීම සහ සෙවීම: 156
ද්විමය සෙවීම: 0
asList.contains: 32

එබැවින් අරාව වර්ග කළ අනුපිළිවෙලින් නිර්මාණය කර ඇත්නම් ද්විමය සෙවීම වේගවත්ම වේ, එසේ නොමැති නම් එය asList().containsයා යුතු මාර්ගය වේ. ඔබට බොහෝ සෙවීම් තිබේ නම්, ඔබට ද්විමය සෙවුම භාවිතා කළ හැකි වන පරිදි අරාව වර්ග කිරීම වටී. ඒ සියල්ල ඔබගේ යෙදුම මත රඳා පවතී.

බොහෝ දෙනා අපේක්ෂා කරන ප්‍රති results ල ඒවා යැයි මම සිතමි. පරීක්ෂණ කේතය මෙන්න:

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));
    }
}

6
මට මෙම කේතය තේරෙන්නේ නැත. ඔබ අරාව 'නූල්' වර්ග කර ද්විමය සෙවුමට ඇමතුම් දෙකෙහිම එකම (වර්ග කළ) අරාව භාවිතා කරයි. හොට්ස්පොට් ධාවන කාල ප්‍රශස්තිකරණය හැර වෙනත් කිසිවක් එය පෙන්වන්නේ කෙසේද? AsList.contains ඇමතුම සමඟ සමාන වේ. ඔබ වර්ග කළ අරාවෙන් ලැයිස්තුවක් සාදයි, ඉන්පසු එහි ඉහළම අගය සහිතව අඩංගු වේ. ඇත්ත වශයෙන්ම එය කාලය ගතවනු ඇත. මෙම පරීක්ෂණයෙහි තේරුම කුමක්ද? නුසුදුසු ලෙස ලියා ඇති මයික්‍රොබෙන්ච් සලකුණක් ලෙස සඳහන් නොකල යුතුය
එරික්

එසේම, ද්විමය සෙවීම යෙදිය හැක්කේ වර්ග කළ කට්ටලයකට පමණක් බැවින්, ද්විමය සෙවීම භාවිතා කළ හැකි එකම ක්‍රමය වර්ග කිරීම සහ සෙවීමයි.
එරික්

වර්ග කිරීම දැනටමත් වෙනත් හේතු ගණනාවක් නිසා සිදු කර ඇත, උදා: එය init මත වර්ග කළ හැකි අතර කිසි විටෙකත් වෙනස් නොවේ. සෙවුම් කාලය තනිවම පරීක්ෂා කිරීමේදී භාවිතයක් ඇත. කෙසේ වෙතත් මෙය පහත වැටෙන තැන ක්ෂුද්‍ර බෙන්ච්මාර්ක් කිරීම සඳහා තාරකා උදාහරණයකට වඩා අඩුය. මයික්‍රොබෙන්ච්මාර්ක් ජාවා හි නිවැරදිව ලබා ගැනීම කුප්‍රකට දුෂ්කර වන අතර නිදසුනක් ලෙස සත්‍ය පරීක්ෂණය ක්‍රියාත්මක කිරීමට පෙර හොට්ස්පොට් ප්‍රශස්තිකරණය ලබා ගැනීම සඳහා ප්‍රමාණවත් තරම් පරීක්ෂණ කේතය ක්‍රියාත්මක කිරීම ඇතුළත් විය යුතුය. උදාහරණ අන්තරායන්
Thor84no

7
එකම JVM අවස්ථාවෙහිදී පරීක්ෂණ 3 ම ක්‍රියාත්මක වන බැවින් මෙම පරීක්ෂණය දෝෂ සහිතය . පසුකාලීන පරීක්ෂණ මගින් හැඹිලිය, JIT යනාදිය උණුසුම් කිරීම මගින් කලින් ලබා ගත් ඒවායින් ප්‍රයෝජන ගත හැකිය
ස්ටීව් කුඕ

4
මෙම පරීක්ෂණය ඇත්ත වශයෙන්ම මුළුමනින්ම සම්බන්ධ නැත. වර්ග කිරීම සහ සෙවීම රේඛීය ගණිතමය (n * ලොග් (n)) සංකීර්ණතාව, ද්විමය සෙවීම ල ar ු ගණකය වන අතර ArrayUtils.contains පැහැදිලිවම රේඛීය වේ. මෙම විසඳුම් මුළුමනින්ම වෙනස් සංකීර්ණ පංතිවල පවතින බැවින් ඒවා සංසන්දනය කිරීමෙන් කිසිදු ප්‍රයෝජනයක් නොමැත.
අදින්න

37

ඉක්මන් අරාව ආරම්භක වාක්‍ය ඛණ්ඩය භාවිතා කරනවා වෙනුවට, ඔබට Arrays.asList ක්‍රමය භාවිතා කරමින් ඒ හා සමාන ආකාරයකින් ලැයිස්තුවක් ලෙස ආරම්භ කළ හැකිය, උදා:

public static final List<String> STRINGS = Arrays.asList("firstString", "secondString" ...., "lastString");

එවිට ඔබට කළ හැකිය (ඉහත පරිදි):

STRINGS.contains("the string you want to find");

36

ජාවා 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);
}

3
ප්‍රාථමික විශේෂීකරණයන් ද සටහන් කිරීම වටී.
skiwi

එකතු කිරීමට, anyMatchජාවාඩොක් එය සඳහන් කරයි "...May not evaluate the predicate on all elements if not necessary for determining the result.", එබැවින් ගැලපීමක් සොයා ගැනීමෙන් පසුව එය දිගටම සැකසීමට අවශ්‍ය නොවනු ඇත.
mkobit

28

අගය සඳහා ද්විමය සෙවීමක් සිදු කිරීමට ඔබට අරා පන්තිය භාවිතා කළ හැකිය . ඔබේ අරාව වර්ග කර නොමැති නම්, අරාව වර්ග කිරීම සඳහා ඔබට එකම පන්තියේ වර්ග කිරීමේ කාර්යයන් භාවිතා කිරීමට සිදුවේ, ඉන්පසු එය හරහා සොයන්න.


එය ඉටු කර ගැනීම සඳහා ඔබට එකම පන්තියේ වර්ග කිරීමේ කාර්යයන් භාවිතා කළ හැකිය ... මම එය මගේ පිළිතුරට එකතු කළ යුතුය.
තෝමස් ඕවන්ස්

1
AsList () හි () ප්‍රවේශයට වඩා වැඩි පිරිවැයක් දැරීමට සිදුවේ, එවිට මම සිතමි. ඔබට බොහෝ විට එම පරීක්‍ෂණය කිරීමට අවශ්‍ය නොවන්නේ නම් (නමුත් එය ආරම්භ කිරීම සඳහා වර්ග කළ හැකි, සාධාරණ වීමට, ස්ථිතික අගයන් ලැයිස්තුවක් නම්).
ජෝයි

සැබෑ. වඩාත්ම be ලදායී වනු ඇති විචල්‍යයන් රාශියක් ඇත. විකල්ප තිබුණත් හොඳයි.
තෝමස් ඕවන්ස්

මෙය සිදු කරන සමහර කේත: stackoverflow.com/a/48242328/9131078
OOBalance

සෙවුමක අරමුණ සඳහා සම්පූර්ණ පෙළක් වර්ග කිරීම මිල අධිකය. ලයිනර් සෙවීම සඳහා අපට එකම CPU කාලය භාවිතා කළ හැකිය. මම කලින් තෝරාගත් පිළිවෙලට සකස් කර ඇති එකතුවක ද්විමය සෙවීමට කැමැත්තෙමි.
arunwithasmile

17

ObStupidAnswer (නමුත් මම හිතන්නේ මෙතන කොහේ හරි පාඩමක් තියෙනවා):

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}

1
ව්‍යතිරේකය විසි කිරීම පෙනෙන තරම් බරයි, නමුත් මෙය ක්‍රියා කරන්නේ නම් වටිනාකමක් පරීක්ෂා කිරීමේ නව ක්‍රමයක් වනු ඇත. අවාසිය නම් එනමරය කලින් නිර්වචනය කළ යුතු වීමයි.
ජේම්ස් පී.

13

ඇත්ත වශයෙන්ම, ටොම් හෝවින් යෝජනා කළ පරිදි ඔබ හැෂ්සෙට් <ස්ට්‍රිං> භාවිතා කරන්නේ නම්, වර්ග කිරීම ගැන කරදර විය යුතු නැත, ඔබේ වේගය කලින් නියම කර ඇති අරාව මත ද්විමය සෙවුමට සමාන වේ, බොහෝ විට ඊටත් වඩා වේගවත් වේ.

ඒ සියල්ල රඳා පවතින්නේ ඔබේ කේතය සකසා ඇති ආකාරය මත ය, පැහැදිලිවම, නමුත් මා සිටින තැන සිට ඇණවුම වනුයේ:

මත unsorted අරා:

  1. හැෂ්සෙට්
  2. asList
  3. වර්ග කිරීම සහ ද්විමය

වර්ග කළ අරාව මත:

  1. හැෂ්සෙට්
  2. ද්විමය
  3. asList

ඉතින් කෙසේ හෝ ජයග්‍රහණය සඳහා හැෂ්සෙට්.


2
හැෂ්සෙට් සාමාජිකත්වය ඕ (1) විය යුතු අතර වර්ග කළ එකතුවක ද්විමය සෙවීම ඕ (ලොග් එන්) විය යුතුය.
ස්කයිලර් සේව්ලන්ඩ්

11

ඔබට ගූගල් එකතු කිරීමේ පුස්තකාලය තිබේ නම්, ටොම්ගේ පිළිතුර ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html) භාවිතා කිරීමෙන් සරල කළ හැකිය.

මෙය සැබවින්ම යෝජිත ආරම්භයේ සිට විශාල අවුල් ජාලයක් ඉවත් කරයි

private static final Set<String> VALUES =  ImmutableSet.of("AB","BC","CD","AE");

10

හැකි එක් විසඳුමක්:

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");
      }
  }
}

8

සංවර්ධකයින් බොහෝ විට කරන්නේ:

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;

පළමුවැන්න දෙවන එකට වඩා කියවිය හැකි ය.


7

සරල ලූපයක් භාවිතා කිරීම මෙය කිරීමේ වඩාත් කාර්යක්ෂම ක්‍රමයයි.

boolean useLoop(String[] arr, String targetValue) {
    for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }
    return false;
}

Programcreek අනුග්‍රහයෙනි


ඉලක්කගත අගයට පෙර අරාවෙහි ශුන්‍ය යොමු කිරීමක් තිබේ නම් මෙය ශුන්‍ය දර්ශක ව්‍යතිරේකයක් දමනු ඇත.
සැමුවෙල් එඩ්වින් වෝඩ්

1
if ප්‍රකාශය විය යුත්තේ: if (targetValue.equals (s)) නිසා String equals සඳහා නිදර්ශන පරීක්‍ෂක ඇත.
TheArchon

ශුන්‍ය ආරක්ෂිත වීමට වෙනුවට Objects.equals (obj1, obj2) භාවිතා කරන්න.
ත්‍රෛභාෂාව

7

දී ජාවා 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);

7
මෙම ප්‍රවේශය සමඟ වාසි තිබේද?
ජොහැන්නස් ස්ටැඩ්ලර්

1
එය ප්‍රශ්නයට පිළිතුරු සපයන්නේ නැත.
ෆ්ලෝරියන් එෆ්

5
  1. සීමිත දිගකින් යුත් අරා සඳහා පහත සඳහන් දෑ භාවිතා කරන්න ( කැමරර් විසින් ලබා දී ඇති පරිදි ). නැවත නැවත පරීක්ෂා කිරීම සඳහා මෙය මන්දගාමී වේ, විශේෂයෙන් දිගු අරා සඳහා (රේඛීය සෙවීම).

     Arrays.asList(...).contains(...)
  2. වේගවත් ක්‍රියාකාරිත්වය සඳහා ඔබ විශාල මූලද්‍රව්‍ය සමූහයකට නැවත නැවත පරීක්ෂා කරන්නේ නම්

    • අරාව යනු වැරදි ව්‍යුහයකි. A භාවිතා කර එයට 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);

4
ඇයි කරදර TreeSetවෙන්නේ? HashSetවේගවත් (O (1)) සහ ඇණවුම් කිරීම අවශ්‍ය නොවේ.
ෂෝන් ඕවන්

5

පහත සඳහන් දෑ භාවිතා කරන්න ( 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(), වෙනත් ස්ථානවල ද භාවිතා කර ඇති බවත්.


මම මෙම සාකච්ඡාවට සම්බන්ධ වීමට ප්‍රමාද වැඩියි, නමුත් මෙම ගැටළුව විසඳීමේ මගේ ප්‍රවේශය, මීට වසර කිහිපයකට පෙර මා එයට මුහුණ දුන් විට, දැනටමත් මෙහි පළ කර ඇති අනෙක් පිළිතුරු වලට වඩා ටිකක් වෙනස් බැවින්, මම එකල භාවිතා කළ විසඳුම පළ කරමි. යමෙකුට එය ප්‍රයෝජනවත් යැයි හැඟේ නම් මෙතැනින්.
අභිෂේක් ඕසා

4

මේක උත්සාහ කරන්න:

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");
}

3

මෙය පරීක්ෂා කරන්න

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
    }
}

1
මෙම කාර්යය නොවේ - එය ඇතුළු වනු ඇත elseසඳහා සෑම ගැලපෙන නොවන බව අයිතමය එහි 3 වතාවක්, සාරධර්ම 3 "නොවේ සිට AB (ඔබ සැරසී බලා" AB "සඳහා කරන්නේ එසේ නම්, එය යන්නේ ").
බර්න්හාර්ඩ් බාර්කර්

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.asListO (n) නොවේ. එය සැහැල්ලු එතුමකි. ක්‍රියාත්මක කිරීම දෙස බලන්න.
පැට්‍රික් පාකර්


2

භාවිත Array.BinarySearch(array,obj)ලබා දී ඇති වස්තුව අරාවෙහි සොයා ගැනීමට .

උදාහරණයක්:

if (Array.BinarySearch(str, i) > -1)`  true --exists

false --not පවතී


4
Array.BinarySearchසහ Array.FindIndex.NET ක්‍රම වන අතර ඒවා ජාවා හි නොපවතී.
ataylor

ayataylor ජාවා හි Arrays.binarySearch ඇත. නමුත් ඔබ හරි, Arrays.findIndex
mente

එය සටහන් කළ යුතුය:The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
ඩෝරියන් ග්‍රේ

1

මුලින් අසත්‍ය ලෙස සකසා ඇති බූලියන් සාදන්න. අරාවෙහි ඇති සෑම අගයක්ම පරීක්ෂා කිරීමට ලූපයක් ධාවනය කර ඔබ පරීක්ෂා කරන අගය සමඟ සසඳන්න. ඔබට කවදා හෝ තරඟයක් ලැබුනේ නම්, බූලියන් සත්‍ය ලෙස සකසා ලූප කිරීම නවත්වන්න. එවිට බූලියන් සත්‍ය බව ප්‍රකාශ කරන්න.


1

ජාවා 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://mytechnology thoughtt.blogspot.com/2019/10/java-8-predicate-test-method-example.html

https://github.com/VipulGulhane1/java8/blob/master/Test.java


0

a භාවිතා කිරීම a 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 == truesearchඅරාවෙහි අඩංගු නම්


මෙම කරන්නේ සැලකෙතත් අරා වැඩ

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 );

0

මම ප්‍රාථමික මට්ටමේ බයිට් සහ බයිට් භාවිතා කරමින් පහත් මට්ටමේ ජාවා සමඟ ගනුදෙනු කරන විට, මට මෙතෙක් ලැබී ඇති හොඳම දේ බයිට්ස්-ජාවා වෙතින් ලබා ගත හැකිය https://github.com/patrickfav/bytes-java කදිම කෘතියක් ලෙස පෙනේ


-2

ඔබට එය ක්‍රම දෙකකින් පරීක්ෂා කළ හැකිය

අ) අරාව නූල් බවට පරිවර්තනය කිරීමෙන් පසුව .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));  

    }

1
නූල් පරිවර්තනය විකාර සහගත ලෙස අකාර්යක්ෂම වන අතර විසඳුම වැරදිය. උදා: (",") අඩංගු වේ.
අටූස්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.