2012-07-08 17 views
5

की मॉड्यूलर तुलना यह एक बहुत ही सरल सवाल की तरह लगता है, लेकिन वहाँ है आश्चर्यजनक रूप से कम इंटरनेट पर इसके बारे में लिखा है, और मैं एक कठिन समय अपने दम पर सही ढंग से लागू करने आ रही है। जावा में ASCII वर्णों पर एक मॉड्यूलर तुलना फ़ंक्शन को कार्यान्वित करने का सबसे अच्छा तरीका क्या है, जैसे तुलना "वर्णमाला के अंत" के आसपास "लपेटती है"? मैं इसे "बीच" फ़ंक्शन के लिए उपयोग करना चाहता हूं जो मनमाने ढंग से स्थानों पर पूरे वर्णमाला को विभाजित कर सकता है, और पूछा जाता है कि 'y' 'x' और 'b' के बीच है या नहीं, तो सही ढंग से "सत्य" लौटाएं।पात्रों

मैं पहले से ही सभी सवाल और जवाब है कि के बारे में मॉड्यूलर अंकगणित पात्रों पर बात मिल गया है, इसलिए मुझे पता है कि इस तरह के कोड के साथ मॉड्यूलर इसके अलावा करने के लिए (चरित्र स्थानांतरण):

char shifted = (((original - 'a') + 1) % 26) + 'a'; 

हालांकि, यह जावा के मॉड्यूलर अंकगणितीय कार्यों में निर्मित है, जो तुलना के बराबर नहीं है। यहां तक ​​कि अगर मैं सादे स्याही का उपयोग कर रहा था, तो मेरे पास जावा से पूछने का कोई तरीका नहीं है यदि < बी < सी मॉड 26 (जो = = 24, बी = 25, और सी = 1) को सच करना चाहिए।

तो सामान्य सवाल यह है कि जावा में मॉड्यूलर तुलना संचालन को लागू करने का सबसे अच्छा तरीका क्या है? यदि यह एक समस्या बहुत मुश्किल है, तो ASCII वर्णमाला के लिए काम करने के लिए ऐसी तुलना करने के लिए कम से कम एक तरीका है?

+0

ध्यान दें कि "मॉड्यूलर तुलना" बाइनरी तुलना के लिए समझ में नहीं आता है: मॉड्यूलर अंकगणित में कोई "कम से कम" आदेश नहीं है। एक "बीच" चीज अभी भी संभव है, हालांकि, आपका प्रश्न remians मान्य है। – MvG

उत्तर

2

सर्कुलर कतार में A < B < C के परीक्षण में, आप हमेशा A <= B मान सकते हैं और या तो चारों ओर लपेटा है या नहीं।

यदि A < B, कोई रैपिंग नहीं हुई है। यदि B < C or C < A है, तो बी ए और सी

यदि A > B के बीच है, तो आप लपेट गए हैं। यदि B < C and C < A, तो बी ए और सी

के बीच है, तो आपको ए == बी, बी == सी, या ए == सी को संभालने के तरीके को परिभाषित करने की आवश्यकता होगी।

+0

यह शानदार ढंग से सरल है। सबसे अच्छा हिस्सा यह है कि यह वर्णमाला की लंबाई पर निर्भर नहीं है, इसलिए मैं उसी कार्य का उपयोग कर सकता हूं, भले ही मेरी स्ट्रिंग में जादू संख्या 26 को बदलने के बिना विराम चिह्न या यूनिकोड वर्ण हो सकें। – Edward

+0

यह भी अच्छा काम करेगा मानों के साथ वर्णमाला जो तुलनीय हैं, लेकिन अंततः अंत तक अंत में संगत नहीं हैं, जैसे कि हेक्साडेसिमल या बेस 64। – phatfingers

1

तो आपका प्रश्न यह है: वर्ण c_1 वर्ण c_2 और c_3 के बीच वर्णित है, बशर्ते वर्णमाला लपेटें?

  • Convert एक नंबर करने के लिए प्रत्येक चरित्र हैं (यानी, a = 1, b = 2, ..., z = 26)। आपके उदाहरण में, c_2 = 'x' = 24 और c_3 = 'b' = 2 के बीच c_1 = 'y' = 25 होगा)।
  • यदि c_3 < c_2, 26 से c_3 जोड़ें। आपके उदाहरण में, यह मामला है क्योंकि 2 < 24
  • अब हम c_1 = 25, c_2 = 24, और c_3 = 28 है।
  • जांचें कि c_1 >= c_2 && c_1 <= c_3 है या नहीं। यदि ऐसा होता है तो चरित्र दो सीमाओं के बीच होता है। यदि यह नहीं है तो अगले चरण के साथ जारी रखें।
  • 26 से c_1 जोड़ें और जांचें कि यह मान उपर्युक्त चेक को पूरा करता है या नहीं। यदि ऐसा होता है तो चरित्र लपेटी सीमाओं के भीतर होता है। अगर यह बंद नहीं होता है।

इस दृष्टिकोण में, आप मूल रूप से 'दूसरे' वर्णमाला में 26 जोड़ रहे हैं। तो:

... 23 24 25 26 1 2 3 4 

हो जाता है:

... 23 24 25 26 27 28 29 30 

फिर आप गणित कर सकते हैं के रूप में आप सामान्य रूप से करना होगा।

संपादित करें: एमवीजी की टिप्पणी के आधार पर अद्यतन एल्गोरिदम। वास्तव में कई स्थितियां हैं: "24 और 2 के बीच 25 है?" लेकिन यह भी "24 और 2 के बीच 1 है?"। बाद के मामले में, आपको यह भी जांचना होगा कि क्या (1 + 26) 24 और (2 + 26) के बीच है - और यह धारण करता है कि चरित्र 'ए' वास्तव में 'x' और 'b' के बीच है।

+0

आपको 26 से 'c_1' भी जोड़ना चाहिए और देखें कि यह सीमा के भीतर है या नहीं। – MvG

+0

@ एमवीजी: धन्यवाद, मैंने अधिक जानकारी के साथ उत्तर अपडेट किया है। –

0

अपने स्वाद के आधार पर, आप बयानों के बजाए मॉड्यूलस ऑपरेटरों का उपयोग करना चाह सकते हैं।

public static boolean isStrictlyBetween(char a, char x, char b) { 
    // assuming x, a, and b are all the same case (lower or upper). 
    return ((x - a + 26) % 26) < ((b - a + 26) % 26); 
} 

इस कोड को सही वापस जाने के लिए अगर एक्स के लिए एक से दक्षिणावर्त दूरी ख के लिए एक से दक्षिणावर्त दूरी से भी कम है का कहना है: एक पंक्ति में तुलना करने के लिए, कुछ इस तरह से करते हैं। +26 आश्वासन देता है कि अंतर अभिव्यक्ति का परिणाम सकारात्मक है (नकारात्मक संख्याओं का% कुछ भाषाओं में अजीब तरीके से प्रदर्शन करता है)। % 26 आपके वांछित मॉड्यूलस करता है।