Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 3

13
votes
answers
36 views
+10

当它是回文时,为什么这个反向的StringBuilder不等于原始的String?

我试图使用 StringBuilder reverse()检查String是否为回文结构。对于像“chan”这样没有对称性的单词,它会正确地返回 false ,但它也会返回 false 以获取像“女士”这样的真正的回文。

代码:

  StringBuilder str = new StringBuilder(“madam”); StringBuilder str2 = new StringBuilder(str); boolean res = str2.equals(str.reverse()。toString()。trim()); System.out.println(str +“”+ str2); 的System.out.println(RES);   

输出:

  madam madam false   

我正在使用Java 8运行Eclipse Neon。

up vote 10 down vote accepted favorite
沙发
+100
+50

str.reverse()。toString()。trim() String ,因此它不能等于 StringBuilder

尝试比较2 String

  boolean res = str2.toString()。equals(str.reverse()。toString ()。修剪());  
     
			
        
+20

如果你想比较字符串,你需要使用 str2.toString()

  boolean res = str2.toString()。equals(str。反向()的toString()修剪())。。  

完整解决方案:

  StringBuilder str = new StringBuilder(“madam”); StringBuilder str2 = new StringBuilder(str); boolean res = str2.toString()。equals(str.reverse()。toString()。trim()); System.out.println(str +“”+ str2); 的System.out.println(RES);   

输出:

  madam madam true   

问题是你正在比较一个StringBuilder对象带有String的str2 ,而不是比较两个字符串。此外, trim()

+10

这一行将 str2 StringBuilder 的一个实例)与 String 的实例进行比较:

  boolean res = str2.equals(str.reverse()。toString()。trim());   

两个不同类的对象总是说它们不相等是很常见的,因为它们通常不会被编程为知道如何检查不同类型对象的内容。(在某些情况下,它被指定工作,例如 java.util.List 的不同实现。)

在这种情况下,它更糟糕,因为< code> StringBuilder 不会覆盖所有 equals 方法 如果您查看课程文档,将看到 equals 列为从 Object 继承的方法之一。因此,只有在传递相同的对象实例时,它才会返回 true ; 从不比较内容

  StringBuilder sb1 = new StringBuilder(“abc”); StringBuilder sb2 = new StringBuilder(sb1); 的System.out.println(sb1.equals(SB1)); //真 相同对象System.out.println(sb1.equals(sb2)); //假 不同的对象(相同的内容)  

所以你无法比较任何 StringBuilder 这样的实例。要进行比较,将反转的结果转换回普通的 String

  String input =“madam”; input = input.trim(); String reversed = new StringBuilder(input).reverse()。toString(); System.out.println(输入+“”+反转); 的System.out.println(input.equals(反转));   

注意:如果您想要 trim()用户输入,请尽早完成。如果你在逆转后修剪,你将不得不削减比较的两半。 反向()的toString(); System.out.println(输入+“”+反转); 的System.out.println(input.equals(反转));

注意:如果您想要 trim()用户输入,请尽早完成。如果你在逆转后修剪,你将不得不削减比较的两半。 反向()的toString(); System.out.println(输入+“”+反转); 的System.out.println(input.equals(反转));

注意:如果您想要 trim()用户输入,请尽早完成。如果你在逆转后修剪,你将不得不削减比较的两半。

17
votes
answers
24 views
+10

为什么字符串添加结果如此奇怪?

  public static void Main(string [] args){int num = 1; string number = num.ToString(); Console.WriteLine(数[0]); Console.WriteLine(number [0] + number [0]); }   

我希望 1 11 的输出,但我得到 1 98 我错过了什么?

沙发
+90
+50

number [0] 的类型是 char ,而不是 string - 你没有执行任何字符串连接。相反,你有一个值为49的 char ('1'的UTF-16值)。没有 +(char,char)运算符,因此两个操作数都被提升为 int ,并且你正在执行整数加法。

所以这一行:

  Console.WriteLine(number [0] + number [0]);   

实际上是这样的:

  char op1 = number [0]; int promote1 = op1; char op2 = number [0]; int promote2 = op2; int sum = promote1 + promote2; Console.WriteLine(总和);   

(它'

+80

由于[],这会给出字符串的第一个字符。

number [0] + number [0] 正在执行49 + 49(ascii代码char 1);

我想你想这样做:

  public static void Main(string [] args){int num = 1; string number = num.ToString(); Console.WriteLine(数); Console.WriteLine(数字+数字); }  
     
			
        

有关更多信息,请参阅此处:stackoverflow.com/questions/16851809/char-char-int-why - Alexander Ushakov 8月28日18:44

感谢Dan的解释,感谢Alexander提供有关该主题的更多内容。 - k0fe 8月28日18:48

0
votes
answers
52 views
+10

找到行數的最快方法?

4

我現在使用什麼:找到行數的最快方法?

numlines := strings.Count(editor.Text(), "
") 
fmt.Print(strconv.Itoa(numlines)) 
message.SetText(strconv.Itoa(numlines)) 

這是每當一個文本框更新運行。最類似這樣做的方式是什麼?

沙发
0
4

這很好。但是請不要忘記,如果最後一個字符不是換行符,則必須將出現次數加1,因爲這將是行數(最後一行可能不會以換行符結束)。

我們可能會認爲,由於您要計算的子字符串只是一個字符(單個rune),因此我們可以創建一個自定義解決方案,僅計算此單個字符的出現(而不是計算子字符串)。它可能看起來像這樣:

func countRune(s string, r rune) int { 
    count := 0 
    for _, c := range s { 
     if c == r { 
      count++ 
     } 
    } 
    return count 
} 

(一種for rangestring值迭代其rune S)

並對其進行測試(試試在Go Playground):

fmt.Println(countRune("asdf
asdf
asdf
", '
')) // Prints 3 

在實踐中,這將不會更快地計算換行符,因爲這是UTF-8編碼中的單個byte,並且strings.Count()已針對子字符串的長度爲1:

// Count counts the number of non-overlapping instances of substr in s. 
// If substr is an empty string, Count returns 1 + the number of Unicode code points in s. 
func Count(s, substr string) int { 
    if len(substr) == 1 && cpu.X86.HasPOPCNT { 
     return countByte(s, byte(substr[0])) 
    } 
    return countGeneric(s, substr) 
} 

func countByte(s string, c byte) int // ../runtime/asm_amd64.s 

能改善一下這個操作的性能(計數線)是,如果你將有機會獲得「內部」字節或編輯的符陣,這樣你就不必調用其Text()方法,它創建並返回其內容的副本。

板凳
0
1

當您詢問有關最快方法的問題時,您應該使用Go testing軟件包基準設施進行測量。

例如,計數行數使用strings.Count並使用for range環在stringlorem ipsum中,並測量來自一個byte切片轉換爲string的任何額外費用。通過計算byte切片中的行數,您可以避免任何byte切片到string開銷。

$ gotest lines_test.go -bench=. 
data: /home/peter/shakespeare.pg100.txt 5589889 
BenchmarkStringCount-4  30000000 57.3 ns/op  0 B/op 0 allocs/op 
BenchmarkStringByRune-4  3000000 563 ns/op  0 B/op 0 allocs/op 
BenchmarkBytesToString-4 10000000 173 ns/op  480 B/op 1 allocs/op 
BenchmarkBytesCount-4  20000000 61.2 ns/op  0 B/op 0 allocs/op 

lines_test.go

package main 

import (
    "bytes" 
    "strconv" 
    "strings" 
    "testing" 
) 

func linesStringCount(s string) string { 
    n := strings.Count(s, "
") 
    if len(s) > 0 && !strings.HasSuffix(s, "
") { 
     n++ 
    } 
    return strconv.Itoa(n) 
} 

func linesStringByRune(s string) string { 
    n := 0 
    for _, r := range s { 
     if r == '
' { 
      n++ 
     } 
    } 
    if len(s) > 0 && !strings.HasSuffix(s, "
") { 
     n++ 
    } 
    return strconv.Itoa(n) 
} 

func linesBytesCount(s []byte) string { 
    nl := []byte{'
'} 
    n := bytes.Count(s, nl) 
    if len(s) > 0 && !bytes.HasSuffix(s, nl) { 
     n++ 
    } 
    return strconv.Itoa(n) 
} 

var data = []byte(`Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
Ut enim ad minim veniam, 
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
Excepteur sint occaecat cupidatat non proident, 
sunt in culpa qui officia deserunt mollit anim id est laborum.`) 

func BenchmarkStringCount(b *testing.B) { 
    text := string(data) 
    b.ReportAllocs() 
    b.ResetTimer() 
    for i := 0; i < b.N; i++ { 
     _ = linesStringCount(text) 
    } 
} 

func BenchmarkStringByRune(b *testing.B) { 
    text := string(data) 
    b.ReportAllocs() 
    b.ResetTimer() 
    for i := 0; i < b.N; i++ { 
     _ = linesStringByRune(text) 
    } 
} 

func BenchmarkBytesToText(b *testing.B) { 
    b.ReportAllocs() 
    b.ResetTimer() 
    for i := 0; i < b.N; i++ { 
     _ = string(data) 
    } 
} 

func BenchmarkBytesCount(b *testing.B) { 
    text := data 
    b.ReportAllocs() 
    b.ResetTimer() 
    for i := 0; i < b.N; i++ { 
     _ = linesBytesCount(text) 
    } 
} 
0
votes
answers
61 views
+10

給人一種獨特的數字ID的名稱

0

我有我的index.php文件下面的代碼給人一種獨特的數字ID的名稱

<?php 
$name = $_GET['name']; 
$id = rand(0,100); // i need a unique id from the name than random 
?> 

我想要做的是,當有人提供他們的姓名,0和100之間的唯一數字ID應該顯示。刷新頁面後不應更改。如果用戶提供名稱「John」,id應該是「99」(或任何其他不會更改的號碼) 如果用戶提供名稱「david」,則id應該是「5」(或任何其他號碼不會改變)

我試過使用MD5,但它會產生更多的數字,我不能使用它,因爲我是一個PHP新手。

對不起,我的英語不好。

+0

那麼這段代碼有什麼問題?這應該給你隨機數。你有刷新或什麼問題? 'md5'不是隨機的,它會爲每個名稱生成相同的值(並且對於不同的名稱可能具有相同的值(https://crypto.stackexchange.com/questions/1434/are-there-two-known-strings哪位-具有最相同-MD5哈希值))。 – chris85

+0

超過2-3位數字有什麼問題? –

沙发
0
0

rand()函數只給你隨機數,但它永遠不會給你任何單詞的唯一編號。最好的解決方案是使用md5,它將您的名字轉換爲總是唯一的 字符串。如果您需要md5的幫助,請告訴我。

+0

我需要生成一個只包含數字(0到100之間)的md5散列。必須有機會獲得每個名字的所有100個號碼。 –

+0

md5無法生成0到100之間的數字,如果使用rand(),則該數字對於每個名稱都不是唯一的。 –

板凳
0
0

在數組中創建一個數組的數組,然後我們對其進行洗牌。獲取混洗陣列的元素。

function generateRandomNumberInRange($min, $max, $quantity) { 
    $randomNumberArray = range($min, $max); 
    shuffle($randomNumberArray); 
    return array_slice($randomNumberArray, 0, $quantity); 
} 

echo "<pre>"; 
$numbersArray = generateRandomNumberInRange(0, 100, 101); 
print_r($numbersArray); 
echo "</pre>" 

for ($i = 0; $i <= 100; $i++) { 
    echo $numbersArray[$i] . "<br/>"; 
} 

然後,您將名稱分配給唯一和隨機數。

0
votes
answers
21 views
+10

我可以從nullptr構造一個string_view嗎?

2

我剛剛發現xcode/clang不允許從char * nullptr構造std :: string_view。我期望這將size()設置爲0,併爲data()返回一個空值,這也是我Ubuntu Linux上的gcc 7.2如何實現它的。我可以從nullptr構造一個string_view嗎?

我查過http://en.cppreference.com/但是找不到任何評論,所以標準說法是什麼?

沙发
0
1

嗯,是的,沒有。您不能將空指針傳遞給std::string_view的構造函數,因爲這會違反它們的先決條件;請參見[string.view.cons]中的構造函數2和3。

std::string_view的默認構造函數集大小爲零,空它的數據,所以你將不得不使用該構造來代替,或者使用此解決方法/訣竅:

std::string_view().swap(your_string); 
+0

您都指向「[海峽,str + traits :: length(str))是一個有效範圍。「但這在這裏沒有幫助。 [nullptr,0]肯定是一個有效的範圍。所以這一切都取決於性狀的標準定義::長度,我可以在哪裏找到它? – Lothar

+0

@Lothar你可能知道'std :: string_view'只是'std :: basic_string_view >的別名。第二個參數是特徵。它似乎沒有說如果'我'超出範圍會發生什麼,所以我只是假設它是無效的[這裏](https://timsong-cpp.github.io/cppwp/char .traits.require#標籤:char.traits.require) – Rakete1111

0
votes
answers
33 views
+10

ArrayList中元素的頻率

2

我正在嘗試編寫一個代碼,用於查找方法中輸入的字符串中的字符的頻率(phraseList()是一種已在使用的方法,它將每個字符放入arrayList) 和返回一個新的List,其中包含字母及其頻率,下面是我的代碼;ArrayList中元素的頻率

public List <String> ltrfrq(String phrase){ 
List <String> list0 = new ArrayList<String>(); 
int count = 1; 
List <String> list = phraseList(phrase.toUpperCase()); 
for(int i = 0; i < list.size(); i++){ 
    for(int j = i + 1; j < list.size(); j++){ 
    if(list.get(i).equals(list.get(j))){ 
     count++; 
    } 
    } 
    if(list.get(i).equals(" ")){ 
    list0.add("Space" + "-" + count); 
    } 
    else{ 
    list0.add(list.get(i) + "-" + count); 
    } 
    count = 1; 
} 
return list0; 
    } 
} 

但是我的問題是,它返回所有的字母,雖然我已經嘗試了許多方法來消除他們喜歡用remove()方法,它仍然無法正常工作,我有這樣的事情

list.remove(list.get(i)); 
i--; 

誰能幫我?謝謝。

+0

你試過一個HashMap <字符,整數>? –

+0

@JabariDash我不是那個。 – toBiloBa

沙发
0
3

HashMaps是鍵值對。但鑰匙是獨一無二的。所以你不能有重複的密鑰。有點像字典,你可以更新一個單詞的值(定義),但是你不會有那個單詞被列出兩次。

關注:https://www.youtube.com/watch?v=j442WG8YzM4

閱讀:https://beginnersbook.com/2013/12/hashmap-in-java-with-example/

輸出:

{a=4, b=3, c=2, d=1} 

我會離開它作爲一個練習,讓你穿越地圖。

import java.util.HashMap; 

public class F { 

    public static void main(String[] args) { 

    String string = "aaaabbbccd"; 

    HashMap<Character, Integer> map = frequency(string); 

    System.out.println(map); 
    } 

    public static HashMap<Character, Integer> frequency(String string) { 
    int length = string.length(); 
    char c; 

    HashMap<Character, Integer> map = new HashMap<Character, Integer>(); 

    for (int i = 0; i < length; i++) { 
     c = string.charAt(i); 

     if (map.containsKey(c)) { 
     map.put(c, map.get(c) + 1); 

     } else { 

     map.put(c, 1); 
     } 
    } 

    return map; 
    } 
} 
+0

謝謝,這很好,但是沒有其他方法可以做到這一點,比使用HashMaps ?,我說這是因爲我還沒有熟悉它,儘管我知道我必須反正學習它。 – toBiloBa

+0

你可以...我認爲算法會更復雜...可能比僅僅學習hashmap如何工作更復雜,但看不到。 –

+0

好的,謝謝.... – toBiloBa

板凳
0
2

如果我只能使用List數據結構(和我自己定製的數據結構),這是我該怎麼做。我會重新定義所有的添加,刪除功能來補償重複的條目。

輸出:

[{a=4}, {b=3}, {c=2}, {d=1}] 

代碼:

import java.util.List; 
import java.util.ArrayList; 

public class F { 

    static class Entry { 
    char character; 
    int count; 

    public Entry(char c, int i) { 
     character = c; 
     count = i; 
    } 

    public String toString() { 
     return "{" + character + "=" + count + "}"; 
    } 
    } 

    public static void main(String[] args) { 

    String string = "aaaabbbccd"; 

    List<Entry> list = frequency(string); 

    System.out.println(list); 
    } 


    public static List<Entry> frequency(String string) { 
    int length = string.length(); 
    char c; 
    Entry entry; 

    List<Entry> list = new ArrayList<Entry>(); 

    for (int i = 0; i < length; i++) { 
     c = string.charAt(i); 

     // add to list 
     add(c, list); 
    } 

    return list; 
    } 

    public static void add(char c, List<Entry> list) { 

    // If the list does not contain the character 
    if (!contains(c, list)) { 
     list.add(new Entry(c, 1)); 

    } else { 

     // Find the entry 
     int index = find(c, list); 

     // If we found the entry's indes 
     if (index >= 0) { 

     // Get the entry 
     Entry temp = list.get(index); 

     temp.count++;   // Increment its count 
     list.remove(index);  // Delete old 1 
     list.add(index, temp); // Insert new 1 
     } 
    } 
    } 

    // Finds the index of an entry thats associated with a character 
    public static int find(char c, List<Entry> list) { 
    int index = -1; 
    int length = list.size(); 


    Entry temp; 


    for (int i = 0; i < length; i++) { 
     temp = list.get(i); 

     if (temp.character == c) { 
     index = i; 
     break; 
     } 
    } 


    return index; 
    } 

    // Remove an Entry from list that is associate with a given character 
    public static List<Entry> remove(char c, List<Entry> list) { 

    for (Entry entry : list) { 
     if (entry.character == c) { 
     list.remove(entry); 
     } 
    } 

    return list; 
    } 

    // Get the entry that correlates to a give character in the list 
    public static Entry get(char c, List<Entry> list) { 
    Entry entryToReturn = null; 

    for (Entry entry : list) { 
     if (entry.character == c) { 
     entryToReturn = entry; 
     break; 
     } 
    } 

    return entryToReturn; 
    } 


    // Checks if the list contains the character 
    public static boolean contains(char c, List<Entry> list) { 
    boolean contains = false; 

    for (Entry entry : list) { 
     if (entry.character == c) { 
     contains = true; 
     break; 
     } 
    } 

    return contains; 
    } 
} 
+0

它的作品謝謝,我知道有另一種方式的線索,謝謝 – toBiloBa

+0

沒問題。但真的考慮這些HashMaps! –

地板
0
1

的HashMap是解決這個問題的簡單的方法。如果你不得不使用列表,你可以先檢查這個字符是否存在於list0中。如果該字符在list0中不存在,則計數其頻率。

更新的代碼:

public static void main(String args[]){ 
    ArrayList <String> list0 = new ArrayList<String>(); 
     int count = 1; 
     //List <String> list = phraseList(phrase.toUpperCase()); 
     ArrayList<String> list = new ArrayList<String>(); 
     list.add("a"); 
     list.add("b"); 
     list.add("a"); 
     list.add("c"); 
     list.add("b"); 
     list.add("a"); 

     for(int i = 0; i < list.size(); i++){ 
      boolean isDuplicate = false; 
      for (String s: list0){ 
       if (s.contains(list.get(i).trim())) 
        isDuplicate =true; 
      } 

      if (!isDuplicate){ 

        for(int j = i + 1; j < list.size(); j++){ 
        if(list.get(i).equals(list.get(j))){ 
         count++; 
        } 
        } 
        if(list.get(i).equals("/s")){ 
        list0.add("Space" + "-" + count); 
        } 
        else{ 
        list0.add(list.get(i) + "-" + count); 
        } 
        count = 1;  
      } 
     } 
     for (String a: list0) 
      System.out.println(a);   
} 
+0

我不知道這是否完整,但我已經檢查過它並沒有工作 – toBiloBa

+0

你會得到什麼輸出? – Maggie

+0

與我沒有if語句相同 – toBiloBa

4楼
0
1

這裏是一個辦法做到這一點使用上Java8 Map提供的新方法merge()

import java.util.HashMap; 
import java.util.Map; 

public class CountLetterFrequency { 

    public static void main(String[] args) { 
     System.out.println(ltrfrq("abacacdea")); 
    } 

    public static Map<Character, Integer> ltrfrq(String phrase){ 
     Map<Character, Integer> frqMap = new HashMap<>(); 
     for(int i=0; i<phrase.length(); i++){ 
      frqMap.merge(phrase.charAt(i), 1, Integer::sum); 
     } 
     return frqMap; 
    } 
} 

輸出:

{a=4, b=1, c=2, d=1, e=1} 

利用該方法merge(),當產品沒有在地圖上,它只是增加了它,在這種情況下會增加key=charAt(i),value=1。另一方面,如果鍵已經在地圖上,則合併調用傳遞當前值和新值的函數,並使用此函數的結果更新地圖。

Integer::sum是方法參考,因爲merge方法需要一個帶有兩個參數的函數,所以我們可以將它重寫爲(currV,newV) -> currV+newV

現在,如果您願意,您可以改用新的Stream API。首先,將String轉換爲IntStream,然後將每個int映射到Character,然後在HashMap上收集結果並將其返回。方法ltrfrq將如下:

public static Map<Character, Integer> ltrfrq(String phrase){ 
    return phrase.chars() 
     .mapToObj(i->(char)i) 
     .collect(HashMap::new, 
      (m,k) -> m.merge(k, 1, Integer::sum), 
      Map::putAll); 
} 
0
votes
answers
29 views
+10

沒有任何標準庫比較不同長度的字符串

1

我想寫一個函數,它根據字母順序比較字符串不區分大小寫。沒有任何標準庫比較不同長度的字符串

char compare(char *x, char *y){ 
    while (*x != ''){ 
     if (tolower(*x) < tolower(*y)){ 
      return -1; 
     } 
     else if (tolower(*x) > tolower(*y)){ 
      return 1; 
     } 
     else{ 
      x++; 
      y++; 
     } 
    } 
return 0; 
} 

但是這個功能不能很好地與分享幾首字母(如字和雙關語)的話工作。所以我試圖修改它:

char compare(char *x, char *y){ 
if (len(*x) < len(*y)){ 
    while (*x != ''){ 
     if (tolower(*x) < tolower(*y)){ 
      return -1; 
     } 
     else if (tolower(*x) > tolower(*y)){ 
      return 1; 
     } 
     else{ 
      x++; 
      y++; 
     } 
    } 
//   all n letters are the same (case insensitive), where n is a length of x 
    if (*y != '') return -1; 
} 
else { 
    while (*y != ''){ 
     if (tolower(*x) < tolower(*y)){ 
      return -1; 
     } 
     else if (tolower(*x) > tolower(*y)){ 
      return 1; 
     } 
     else{ 
      x++; 
      y`++; 
     } 
    } 
//   all n letters are the same (case insensitive), where n is a length of y 
    if (*x != '') return 1; 
} 
return 0; 
} 

但它沒有工作。我怎樣才能修改這個功能,使'文字遊戲'會比'文字'更大?

+0

你不能用'stricmp'吧? –

+0

存在打印錯誤,而不是++和b ++寫入x ++&y ++以及len(* x)如何工作。 – achal

+0

@ Jean-FrançoisFabre不是我不能,我只是不想 – jakes

沙发
0
1

你的第一次嘗試是(幾乎)還好,只是需要對於你提出

char compare(const char *x, const char *y){ 
    while ((*x != '') && (*y != '')) { // testing y for symmetry 
     if (tolower(*x) < tolower(*y)){ 
      return -1; 
     } 
     else if (tolower(*x) > tolower(*y)){ 
      return 1; 
     } 
     else{ 
      x++; 
      y++; 
     } 
    } 
// added conditions to handle shorter/longer strings 
if (*x == '') 
    { 
     if (*y == '') 
     { 
     return 0; 
     } 
     else 
     { 
     return -1; 
     } 
    } 
    return 1; 
} 

我已經刪除了長度測試問題的調整,增加了邏輯來處理你提到的情況。也許它不是最優化的代碼,但它的工作(也注意到,我測試在主迴路X & y絃線的一端)

我反對stricmp結果測試,我得到同樣的結果:

void test(const char*a,const char*b) 
{ 
    printf("test %s %s => %d, %d
",a,b,compare(a,b),stricmp(a,b)); 
} 

int main(void) { 
    test("abc","aBcd"); 
    test("abc","aBcd"); 
    test("abc","aBc"); 
    test("abcdef","abC"); 
    test("abcdef","cdef"); 

} 

結果:

test abc aBcd => -1, -1 
test abc aBcd => -1, -1 
test abc aBc => 0, 0 
test abcdef abC => 1, 1 
test abcdef cdef => -1, -1 
0
votes
answers
60 views
+10

Python:編寫命令行指令時的字符串格式化

1

我有一個任務,我必須每次運行一系列參數略有不同的仿真。我想編寫一個Python腳本來自動執行此操作,但我遇到了一個問題。Python:編寫命令行指令時的字符串格式化

爲了簡化描述,我基本上有從命令行調用的N模擬,每個模擬都有一組不同的參數,我希望腳本一個接一個地執行它們。想象一下,要運行模擬,我會將execute_simulation...寫入命令行,其中...代表給定模擬的參數。這是我的腳本看起來像:

from subprocess import call 

<code> 

for i in range(0, N): 
    call('execute_simulation_%s' % (parameters[i])) 

但是,我總是在調用腳本時收到錯誤消息。任何人都可以提出爲什麼這可能是這種情況?

+2

什麼是錯誤信息? ['call'](https://docs.python.org/2.7/library/subprocess.html#subprocess.call)需要一個參數列表,而不是一個字符串(除非你使用'shell = True',你應該避免)。 – 2017-11-11 18:11:23

+1

什麼錯誤消息? –

+0

準確的模擬文件是什麼?你的'parameters []'是否也包含文件擴展名? 'call('ca%s.exe'%'lc')'正在爲我工??作(Win7)。 – bastelflp

沙发
0
0

如果您包含錯誤消息,但我會盡力幫助您。

call功能將字符串的順序不是一個字符串(雖然Popen文檔指出它們轉換爲Windows上的字符串,因此它可能在特定的情況下工作)。

此外,在您給出的示例代碼中,您做了call('execute_simulation_%s' % (parameters[i]))。如果parameters[i]不是字符串,而是列表,元組,生成器或str將在該對象上調用,這意味着您得到類似execute_simulation ['arg0', 'arg1', 'arg2', 'arg3', 'arg4']的東西。這可能不是你想要的。您可以在序列上撥打' '.join以獲得類似execute_simulation arg0 arg1 arg2 arg3 arg4的內容。

這樣說的話,我認爲parameters列表包含每個調用的參數列表。然後,你可以只是做

args = [f'arg{i}' for i in range(5)] 
parameters = [args for i in range(5)] 

for args in parameters: 
    call(('execute_simulation', *args)) 

而且,考慮使用subprocess.run,因爲它建議在Python使用3.5+代碼(它的工作原理就像call)。 我希望這適用於你的情況。

0
votes
answers
56 views
+10

檢查是否Textfile.txt包含某些字符串

0

我正在創建一個系統來驗證文本文件是否包含此序列號,如果它包含它將打開到Form2。檢查是否Textfile.txt包含某些字符串

enter image description here

沙发
0
1
Dim content = My.Computer.FileSystem.ReadAllText(filePath) 
If content.Contains(stringToSearch) Then 
    Dim form As New Form2 
    form.Show() 
End If 
+0

效果很不錯,謝謝! –

0
votes
answers
33 views
+10

如何從一個字符串中搜索所有字符Dictionary.Values()

4

首先,我知道有很多類似的帖子我已經在下面列出,但是,沒有人知道我回答的問題是面對這是因爲我發現的所有問題都是如何在'dict.values()'中搜索一個字符串,而不是搜索字符串中的每個字符,並檢查它是否在'dict.values()'和如果它在'dict.values()'的字符中出現的字符串中找到任何字符,它將返回哪些字符和多少字符。如何從一個字符串中搜索所有字符Dictionary.Values()

鏈接到類似的職位不回答這個問題,但可能是有用的一些:

How to search if dictionary value contains certain string with Python

Find dictionary items whose key matches a substring

How can I check if the characters in a string are in a dictionary of values?

How to search if dictionary value contains certain string with Python

這是我迄今爲止,但似乎沒有工作...

characters = {'small':'abcdefghijklmnopqrstuvwxyz', 
       'big':'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
       'nums':'', 
       'special':"!#$%&()*+,-./:;<=>[email protected][]^_{|}~",} 

password = 'aAb' 

def count(pass_word,char_set): 

    num_of_char = 0 
    char_list = [] 

    for char in pass_word: 
     if i in char_set.values(): 
      num_of_char +=1 
      char_list += i 

    return char_list, num_of_char 


#Print result 

print(count(password,characters)) 

輸出應該類似於:

'a','A','b' 
3 

希望你明白我的意思,如果有什麼不清楚的,請發表評論,這樣我就可以改善。

+0

不好意思問,但什麼ü平均組件明智的即時通訊新張貼和從來沒有碰到過這句話 – Ivan

+1

不用擔心他,所有你需要做的就是提供相關的標籤,你所做的。如果他不想閱讀帖子,就擰他。 – postoronnim

+0

; D好的,謝謝 – Ivan

沙发
0
1
def count(password, char_dict): 
    sanitized_pass = [char for char in password if any(char in v for v in char_dict.values())] 
    return sanitized_pass, len(sanitized_pass) 

這是一種方法。另一個辦法是建立所有接受Ç 字符的set並傳遞給函數的密碼

from itertools import chain 


char_set = set(chain.from_iterable(characters.values())) 

def count(password, chars): 
    sanitized_pass = [char for char in password if char in char_set] 
    return sanitized_pass, len(sanitized_pass) 
+0

嘿,即時通訊只是想知道代碼是從哪個'dict.key()'每個字符被發現打印出來? – Ivan

+1

@伊萬我不知道我明白。你的意思是試圖確定我們用哪個字母來代替某個角色?如果有重複項,稍後的項目將覆蓋較早的項目,因此無論哪個字母表更接近'alphabets'迭代的末尾將被使用 –