要找到MySQL整個Schema中的varchar欄位是否有某個字,然後把該字替換掉。
這篇要筆記的是如何寫一個MySQL Stored Procedure,有
A.
列出Schema所有varchar欄位,把找到的結果塞到CURSOR
DECLARE cur1 CURSOR FOR select table_name, column_name from information_schema.columns
where table_schema = 'genius' and data_type = 'varchar' order by table_name,ordinal_position;
B.
LOOP CURSOR,先看某table中某column是否包含要找的關鍵字,有找到的話就執行update。
全字母句Pangram : 包含有字母表中所有字母並且言之成義的句子稱為全字母句。
例如:The quick brown fox jumps over the lazy dog
此練習是檢查某一句子是否為Pangram。
對語言的熟悉度和解題邏輯會影響程式寫法和效率。
多看其他人的寫法才會能寫出比較好的解法。
方式A.
方式B.
方式C.
public static boolean isPangram(String input){
if( null == input || "".equals(input)){
return false;
}
char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();
Map<String, Integer> asciiCountMap = new HashMap<String, Integer>();
for (char c : alphabet) {
asciiCountMap.put(c+"", 0);
}
Set<String> keySet = asciiCountMap.keySet();
boolean isInputPangram = true;
char[] inputAsCharArr = input.toCharArray();
for (char c : inputAsCharArr) {
if( c != ' '){
for (String string : keySet) {
if( string.equalsIgnoreCase(new Character(c).toString()) ){
Integer inte = asciiCountMap.get(string);
inte += 1;
asciiCountMap.put(string, inte);
}
}
}
}
for (String string : keySet) {
if( asciiCountMap.get(string) == 0 ){
isInputPangram = false;
break;
}
}
return isInputPangram;
}
很長的解法,而且效能很差。
public static Boolean isPangram(String input) {
if (input == null || "".equals(input)) {
return false;
}
Set<Character> m = new HashSet<Character>();
int len = input.length();
for (int i = 0; i < len; i++) {
char c = input.charAt(i);
if (c >= 'a' && c <= 'z') {
m.add(c);
}
if (c >= 'A' && c <= 'Z') {
m.add(Character.toLowerCase(c));
}
}
return m.size() == 26;
}
不常用char,所以沒能直接用字母去比較, 這個解法自己還蠻喜歡。
有時候看到感覺比較進階(沒有辦法一下子看懂)的javascript寫法時,會覺得哇!原來可以這樣寫或這樣好像比較厲害。
不過寫code還是簡潔易懂會比較好。
<form id="contextForm" class="form" >
<input type="checkbox" id="checkAll" onclick="checkAllDetail();" />check all type1
<ul>
<li><input type="checkbox" name="id" value="001" />001</li>
<li><input type="checkbox" name="id" value="002" />002</li>
<li><input type="checkbox" name="id" value="003" />003</li>
<li><input type="checkbox" name="id" value="004" />004</li>
</ul>
</form>
function checkAllDetail() {
loopDetail(function(selector) {
selector.prop('checked', $('#checkAll').prop('checked'));
});
}
function loopDetail( aFunction ) {
if ( aFunction ) {
$( "input[name='id']", $('#contextForm') ).each(function() {
aFunction( $(this) );
});
}
}
上面的checkbox 點選 check all type1 時呼叫checkAllDetail()
這個function,然後在這function中再去呼叫loopDetail( function parameter )
。
剛開始看覺得程式碼大約10行,還蠻短的,不過卻沒能馬上讀懂,覺得很厲害。
但是其實這樣寫真的很多餘。
Java 8 新增Stream Package,使用Stream可以少寫很多for 和 if。
下表是不同幣別的商品及金額,這邊要來用Stream來取得表中各幣別的金額合計。
ProductName | Currency | Price |
---|---|---|
bookTW1 | TWD | 100 |
bookTW2 | TWD | 200 |
bookJP1 | JPY | 1000 |
bookJP2 | JPY | 10000 |
bookUS1 | USD | 10 |
bookUS2 | USD | 15 |
首先是拿到表中每種幣別的集合,呼叫createProduct()拿到含所有product的productList後,把productList.stream()後,用.map() get product中的currency,最後以.collect 把取得的currency 放到Set中,就可先將不重複的幣別拿出來。
List<Product> productList = createProduct();
Map<String, BigDecimal> currencyValuMap = new HashMap<>();
Set<String> currencyStringSet = productList.stream().filter(x -> null != x.getCurrency() )
.map(Product::getCurrency)
.collect(Collectors.toSet());
System.out.println(currencyStringSet);
//output --> [TWD, JPY, USD]
直接用forEach 去跑 currencyStringSet中的每種幣別,在.filter中比對到相同幣別時,用.mapToDouble 來拿price 這個double field,並可直接下.sum()來加總每個商品的price。