جافا:أسهل طريقة لاستبدال السلاسل بسلاسل عشوائية

StackOverflow https://stackoverflow.com/questions/237058

  •  04-07-2019
  •  | 
  •  

سؤال

ستتكون السلسلة من رموز معينة (ax،bx،dx،c،acc على سبيل المثال) وأرقام.

السابق:الفأس 5 5 DX 3 ACC C AX BX

أريد استبدال أحد الرموز أو جميعها (عشوائيًا) برمز آخر من نفس المجموعة.على سبيل المثال، استبدل أحد {ax,bx,dx,c,acc} بواحد من {ax,bx,dx,c,acc}.

مثال الاستبدال:ACC 5 5 DX 3 ACC C AX BX أو C 5 5 DX 3 ACC C AX AX

هل هناك طريقة للقيام بذلك مع regexes؟في جافا؟إذا كان الأمر كذلك، ما هي الأساليب التي يجب أن أستخدمها؟

هل كانت مفيدة؟

المحلول

وأعتقد أن هذا هو الحل الأكثر نظيفة لاستبدال مجموعة معينة من الرموز من سلسلة تحتوي على مجاميع منهم. appendreplacement هو المفتاح لهذا الأسلوب. واحدة تحذير هام: لا تشمل أية أحرف الدولار unescped ($) في قائمة العناصر الخاصة بك. يهرب منهم باستخدام "\ $" في نهاية المطاف استخدام
    .replaceall ( "\ $"، "\\ $")؛ على كل سلسلة قبل إضافتها إلى القائمة. انظر أيضا في جافادوك في شك حول علامات $.

import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class ReplaceTokens {
public static void main(String[] args) {
    List<String> elements = Arrays.asList("ax", "bx", "dx", "c", "acc");
    final String patternStr = join(elements, "|"); //build string "ax|bx|dx|c|acc" 
    Pattern p = Pattern.compile(patternStr);
    Matcher m = p.matcher("ax 5 5 dx 3 acc c ax bx");
    StringBuffer sb = new StringBuffer();
    Random rand = new Random();
    while (m.find()){
        String randomSymbol = elements.get(rand.nextInt(elements.size()));
        m.appendReplacement(sb,randomSymbol);
    }
    m.appendTail(sb);
    System.out.println(sb);
}

/**
 * this method is only needed to generate the string ax|bx|dx|c|acc in a clean way....
 * @see org.apache.commons.lang.StringUtils.join    for a more common alternative...
 */
public static String join(List<String> s, String delimiter) {
    if (s.isEmpty()) return "";
    Iterator<String> iter = s.iterator();
    StringBuffer buffer = new StringBuffer(iter.next());
    while (iter.hasNext()) buffer.append(delimiter).append(iter.next());
    return buffer.toString();
}

نصائح أخرى

للرد على السؤال الأول: لا

ومنذ تقومون به عشوائية استبدال، والتعابير المنطقية لن يساعدك، لا شيء حول التعابير المنطقية عشوائي. * منذ السلاسل الخاصة بك في صفيف، لا تحتاج إلى العثور عليها مع أي نمط مطابقة، REGEX ذلك مرة أخرى ليست ضرورية.

و** تحرير: تم تحرير هذه المسألة حتى أنه لم يعد يقول السلاسل في صفيف. في هذه الحالة، على افتراض انهم جميعا في سلسلة واحدة كبيرة، قد بناء التعابير المنطقية للعثور على الأجزاء التي تريد استبدال، كما هو مبين في إجابات أخرى. *

  1. نعم، يمكن القيام بذلك باستخدام regexes.ربما ليس بشكل جميل للغاية ، لا يخلو من حلقة أو اثنتين
  2. نعم، يمكن تنفيذ ذلك في جافا.
  3. يرى عشوائي, ، ال regex طَرد
  4. ويترك التنفيذ كتمرين للطالب.

واستخدم الطبقة لتوليد كثافة عشوائي لاختيار مؤشر من الرموز.

    String text = "ax 5 5 dx 3 acc c ax bx";
    System.out.println("Original: " + text);
    String[] tokens = text.split(" ");
    List<Integer> symbols = new ArrayList<Integer>();
    for(int i=0; i<tokens.length; i++) {
        try {
            Integer.parseInt(tokens[i]);
        } catch (Exception e) {
            symbols.add(i);
        }
    }
    Random rand = new Random();
    // this is the part you can do multiple times
    int source = symbols.get((rand.nextInt(symbols.size())));
    int target = symbols.get((rand.nextInt(symbols.size())));
    tokens[target] = tokens[source];

    String result = tokens[0];
    for(int i=1; i<tokens.length; i++) {
        result = result + " " + tokens[i];
    }
    System.out.println("Result: " + result);

تأكد العديد من كبدائل ما تحتاج إليه قبل <كنت على أ href = "http://hivemind.apache.org/hivemind1/hivemind/apidocs/org/apache/hivemind/util/StringUtils. أتش تي أم أل "يختلط =" نوفولو noreferrer "> الانضمام الرموز معا مرة أخرى.

وهناك جزئين هنا قد تبدو صعبة. أولا، الصيد محاولة لتحديد تلك الرموز التي ليست صحيحة. أنصحك سحب هذا الجزء للخروج الى طريقتها الخاصة، حيث كان يعمل، لكنه hacky قليلا.

والثاني هو حيث أنا وضعت المتغيرات source وtarget. ما أفعله هناك الحصول على مؤشر تم اختيارها عشوائيا <م> واحد من الرموز غير رقمية. مرة واحدة لدي اثنين من المؤشرات العشوائية، أستطيع أن مقايضتهم في السطر التالي.

وبديل سيكون، لبناء سلسلة جديدة من الرموز تم اختيارها عشوائيا بعد أن كنت قد تقسيم سلسلة الأصلي في صفيف.

والرجال بفضل حفنة. وهنا ما خطرت لي. نرى ما اذا كان يمكن التوصل إلى طريقة أكثر كفاءة.

private final String[] symbolsPossible = {"ax","bx","cx","dx","foo"};
private boolean exists;
private final String mutate(String s)
{
String[] tokens=s.split(" ");
for(int j=0; j<tokens.length; j++)
if(Math.random()<.1) //10% chance of mutation per token
{
//checking to see if the token is a supported symbol
exists=false;
for(int i=0; i<symbolsPossible.length; i++)
    if(tokens[j].equals(symbolsPossible[i]))
       exists=true;
if(exists)
    tokens[j]=symbolsPossible[(int)Math.random()*symbolsPossible.length];
}
StringBuffer result=new StringBuffer();
for(String t:tokens)
    result.append(t);
return result;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top