2012-10-10 6 views
6

मेरे पास जावा में युगल की एक सरणी है: arr1 जिसे मैं सॉर्ट करना चाहता हूं। संभवतः पहला विकल्प यूटिलिटी विधि Arrays.sort(double[]) होगा।सॉर्ट करें और किसी अन्य सरणी में परिवर्तनों को प्रतिबिंबित करें

विचार यह है कि मैं एक ही परिवर्तन चाहते हैं (उदाहरण के लिए index i पर मूल्य arr1 में index j में मूल्य के साथ अदला-बदली कर रहा है) पूर्णांकों का एक और सरणी में परिलक्षित होना: (arr2 अर्थ में है कि एक ही अनुक्रमित पर मान बदल रहे हैं arr2 में भी)।

जावा में इसे पूरा करने के लिए कोई आसान तरीका (एक चाल) है? या एकमात्र तरीका सॉर्टिंग एल्गोरिदम को स्वयं लागू करना है?

अद्यतन: मुझे लगता है कि लोगों को 2 मूल्यों (arr1 से एक और arr2 से एक) से युक्त वस्तुओं में से एक सरणी के साथ दो सरणियों की जगह सलाह देते हैं। क्या यह कुछ दक्षता दंड नहीं लाएगा। दूसरे शब्दों में, क्या प्राचीन वस्तुओं की एक सरणी (इस मामले में युगल) की तुलना में ऑब्जेक्ट्स की सरणी को सॉर्ट करना कम कुशल नहीं है?

डेटा पूरी तरह स्थिर है। यह बड़ा है (यह स्मृति में फिट बैठता है) लेकिन स्थिर है।

+2

इंडेक्स की एक सरणी है। मान सरणी को सॉर्ट न करें, इंडेक्स सरणी को सॉर्ट करें। फिर दोनों मान सरणी को इंगित करने के लिए अनुक्रमणिका सरणी का उपयोग करें। समाधान देखें: http: //stackoverflow.com/questions/4859261/get-the-indices-of-an-array-after-sorting – Raihan

+0

http://stackoverflow.com/questions/112234/sorting-matched-arrays -इन-जावा – talnicolas

+0

यही है जिसे "बाहरी सॉर्ट" कहा जाएगा। –

उत्तर

7

क्रमबद्ध समानांतर सरणी को बनाए रखने की कोशिश करने के बजाय, एक क्लीनर समाधान एक वर्ग बनाना होगा जो आपके दोनों डेटा मानों को समाहित करता है, और केवल वस्तुओं की एक सरणी है।

(लेकिन आपके प्रश्न का उत्तर देने के लिए, जावा में ऐसा करने का कोई अंतर्निहित तरीका नहीं है। अपने स्वयं के सॉर्ट रूटीन को कार्यान्वित करना जो उनमें से एक में मूल्यों के आधार पर क्रमबद्ध दो सरणी रखता है, उस डेटा की थोड़ी मात्रा के लिए काम करेगा बदलने की संभावना नहीं है, लेकिन इसे बनाए रखना मुश्किल होगा।)

+0

ऑब्जेक्ट्स की सरणी को सॉर्ट करना उतना ही कुशल है जितना युगल की सरणी को सॉर्ट करना? – Razvan

+0

@Razvan वस्तुओं की एक सरणी छंटनी बेहद कुशल होने जा रही है। मुझे संदेह है कि आप अंतर को मापने में सक्षम होंगे। –

+1

बस सोचा कि मुझे आपकी नई वस्तु के लिए 'तुलनात्मक' इंटरफ़ेस का उल्लेख करना चाहिए। http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html –

1

एक समाधान जो सॉर्टिंग के प्रदर्शन को प्रभावित नहीं करता है, यानी अभी भी ओ (nlog (n)) समय जटिलता।

  • मानचित्र का प्रयोग करें क्रमबद्ध सरणी पर सरणी स्टोर करने के लिए array[i] -> i
  • क्रमबद्ध
  • दोहराएं, और प्रत्येक मान के लिए, नक्शे के लिए एक प्रमुख के रूप में उपयोग मूल सूचकांक पुनः प्राप्त करने के।

संपादित करें: Raihan टिप्पणी मुझे दुखी :(

1

इसे इस तरह का प्रयास करें बनाने ....

- -Arrays.asList()

का उपयोग कर ArrayList में इस array कन्वर्ट एक और सूची ऑब्जेक्ट रेफरेंस वेरिएबल बनाएं और उसी ऐरेलिस्ट ऑब्जेक्ट को असाइन करें, अब पहले ArrayList में कोई भी बदलाव से परिलक्षित होगा कंड ArrayList।

उदाहरण के लिए:

double[] array = new double[10]; 

ArrayList<Double> arList_1 = new ArrayList<Double>(Arrays.asList(array)); 

ArrayList<Double> arList_2 = arList2; 

अब छँटाई के लिए, 2 विकल्प हैं:

- उपयोग java.lang.Comparable इंटरफ़ेस, यदि आप केवल 1 रास्ता में यह क्रमबद्ध करना चाहते हैं।

- उपयोग java.util.Comparator इंटरफेस, आप 1 जिस तरह से अधिक में यह सॉर्ट करने के लिए चाहते हैं।

0

ध्यान दें कि आप क्या देख रहे हैं लेकिन आसपास एक अन्य काम इस तरह हो सकता है।

नक्शा बनाएं arr1 और arr2 elments

 Map<Double, Double> myLocalMap<Double, Double>(); 
     for(int ind=0; indx < arr1.length; indx++){ 
      myLocalMap.put(Double.valueOf(arr1[indx]), Double.valueOf(arr2[indx])); 
     } 

अब तरह arr1 के बीच संबंध बनाए रखने के लिए के रूप में आप ने कहा:

 Arrays.sort(arr1); 

एक बार arr1 क्रमबद्ध किया जाता है, arr2 नीचे के रूप में अद्यतन:

 for(int ind=0; indx < arr1.length; indx++){ 
      arr2[indx] = myLocalMap.get(arr1[indx]).doubleValue(); 
     } 
संबंधित मुद्दे

 संबंधित मुद्दे